Spring Boot升级Jackson后自定义PageImpl反序列化失效问题
问题解决思路与方案
1. 先修复响应格式异常(XML转JSON)
新版本Jackson可能改变了消息转换器的优先级,导致默认返回XML而非JSON。可以通过配置强制指定JSON为默认响应格式:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 清空默认转换器,优先添加JSON转换器 converters.clear(); converters.add(new MappingJackson2HttpMessageConverter(jacksonObjectMapper())); // 如果仍需支持XML,再添加XML转换器(可选) // converters.add(new Jaxb2RootElementHttpMessageConverter()); } @Bean public ObjectMapper jacksonObjectMapper() { ObjectMapper mapper = new ObjectMapper(); // 配置基础序列化规则,比如忽略空值、不识别未知属性不报错 mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); return mapper; } }
2. 修复CustomDtoPage的序列化/反序列化逻辑
PageImpl在Jackson新版本中的序列化逻辑有变化,自定义子类需要明确字段映射和构造器:
public class CustomDtoPage<T> extends PageImpl<T> { @JsonProperty("content") private final List<T> content; @JsonProperty("page") private final int page; @JsonProperty("size") private final int size; @JsonProperty("totalElements") private final long totalElements; // 业务用构造器 public CustomDtoPage(List<T> content, Pageable pageable, long total) { super(content, pageable, total); this.content = content; this.page = pageable.getPageNumber(); this.size = pageable.getPageSize(); this.totalElements = total; } // Jackson反序列化专用构造器 @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) public CustomDtoPage(@JsonProperty("content") List<T> content, @JsonProperty("page") int page, @JsonProperty("size") int size, @JsonProperty("totalElements") long totalElements) { super(content, PageRequest.of(page, size), totalElements); this.content = content; this.page = page; this.size = size; this.totalElements = totalElements; } // 重写父类getter,确保返回自定义字段值 @Override public int getNumber() { return this.page; } @Override public int getSize() { return this.size; } @Override public long getTotalElements() { return this.totalElements; } // 重写分页判断方法,基于自定义字段计算 @Override public boolean hasNext() { return (this.page + 1) * this.size < this.totalElements; } }
3. 强制锁定兼容的Jackson版本
如果上述配置仍有兼容性问题,直接把Jackson版本锁回Spring Boot 2.1.x兼容的稳定版(比如2.9.10.8):
Maven配置示例:
<properties> <jackson.version>2.9.10.8</jackson.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.fasterxml.jackson</groupId> <artifactId>jackson-bom</artifactId> <version>${jackson.version}</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement>
内容的提问来源于stack exchange,提问作者DJViking
相关产品推荐
相关产品推荐

