JSON parse error: mica-xss: can‘t deserialize value of type java.lang.String from VALUE_NUMBER_...
遇到一个异常:
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));
}
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)