遇到一个异常:

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: mica-xss: can't deserialize value of type java.lang.String from VALUE_NUMBER_FLOAT; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: mica-xss: can't deserialize value of type java.lang.String from VALUE_NUMBER_FLOAT

经排查是因为引入的第三方jar包重写了springboot自带的JsonDeserializer逻辑:

public abstract class MyDeserializer extends JsonDeserializer<String> {

	@Override
	public String deserialize(JsonParser p, DeserializationContext ctx) throws IOException {
		JsonToken jsonToken = p.getCurrentToken();
		if (JsonToken.VALUE_STRING != jsonToken && JsonToken.VALUE_NUMBER_INT != jsonToken) {
			throw MismatchedInputException.from(p, String.class,
					"mica-xss: can't deserialize value of type java.lang.String from " + jsonToken);
		}
		//......
	}
}

第三方jar包是通过springboot的AutoConfiguration自动装配的:

@Bean
public Jackson2ObjectMapperBuilderCustomizer xxxBean(
        HedtXssProperties properties) {
    return builder -> builder.deserializerByType(String.class, new 第三方jar包类(properties));
}

这就导致前端传递的「浮点型数字(VALUE_NUMBER_FLOAT,如 25.0)」无法直接反序列化为后端 String 类型字段,即使 Jackson 原生配置了 ACCEPT_FLOAT_AS_INT 也会被 mica-xss 拦截。

问题的关键是,第三方jar包里面的这个功能是系统必须的。

我给出的解决办法是:重写了第三方jar包里面的逻辑,去除Jackson字段序列化部分的判断。

首先重写一个类,把抛异常的部分删掉。然后自定义一个BeanDefinitionRegistryPostProcessor,重写postProcessBeanDefinitionRegistry方法,删除第三方jar包里面的@Bean注入的类,将自己重写的类注入进去:

@Configuration
public class AppConfig implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        String xxxxBean = "xxxxBean";
        if (registry.containsBeanDefinition(xxxxBean)) {
            registry.removeBeanDefinition(xxxxBean);
        }
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {}

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer(
            CustomerProperties properties) {
        return builder -> builder.deserializerByType(String.class, new CustomerJacksonCustomizer(properties));
    }
}
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐