升级json-smart 2.4.7后Rest调用出现Comparison method violates its general contract异常如何解决
问题根因
你遇到的异常是json-smart 2.4.7版本的已知Bug:该版本内部实现的JSON字段排序Comparator违反了比较器的自反、传递、对称三大契约,而JDK 7及以上版本默认开启了排序规则校验,只要检测到不符合契约的Comparator就会直接抛出Comparison method violates its general contract!错误。
Spring Boot的RestTemplate默认会自动加载classpath下可用的JSON序列化库,你更新json-smart版本后,RestTemplate在序列化/反序列化请求、响应数据时触发了这个内部排序Bug。
修复方案
- 方案1:升级json-smart到无Bug稳定版本
该问题在json-smart 2.4.9及以上版本已经被官方修复,直接修改pom.xml中的版本号即可:
<dependency> <groupId>net.minidev</groupId> <artifactId>json-smart</artifactId> <version>2.4.9</version> </dependency>
- 方案2:临时应急兼容(不推荐长期使用)
如果暂时无法升级依赖,可以在JVM启动参数中添加如下配置,关闭排序规则校验:java -Djava.util.Arrays.useLegacyMergeSort=true -jar your-application.jar
该方案会回退到JDK6的排序逻辑,存在性能和排序稳定性隐患,仅建议作为临时应急手段。 - 方案3:指定RestTemplate的序列化工具
如果你不需要使用json-smart作为默认JSON序列化库,可以主动配置RestTemplate使用Jackson作为序列化实现,从根源规避json-smart的Bug:
@Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); // 优先使用Jackson的消息转换器 restTemplate.setMessageConverters(Collections.singletonList(new MappingJackson2HttpMessageConverter())); return restTemplate; } }
额外注意
你贴出的API接口是GET /student/{email}类型的GET请求,但你调用时使用的是postForEntity方法,属于请求方法不匹配,修复完JSON序列化问题后需要同步调整为getForEntity或者修改接口为POST类型,否则会抛出405请求方法不支持错误。
内容的提问来源于stack exchange,提问作者Joy
相关产品推荐
相关产品推荐

