开发者社区 问答 正文

SpringBoot 2.2.2:用于自定义分页的Jackson序列化器不起作用

从SpringBoot 2.2.2开始,带有Jackson(2.10.1)的自定义分页序列化程序不起作用,并且在序列化时不会执行。

/**
 * This class allows to specify configuration related to the Web MVC part.
 */
@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    private static final String JSON_DATA_PROPERTY = "data";

    /**
     * Allows to configure a {@link JsonSerializer} for pagination.
     *
     * @return an instance of {@link Module}.
     */
    @SuppressWarnings("rawtypes")
    @Bean
    public Module springDataPageModule() {
        return new SimpleModule().addSerializer(Page.class, new JsonSerializer<Page>() {
            @Override
            public void serialize(final Page page, final JsonGenerator jsonGenerator,
                    final SerializerProvider serializers) throws IOException {

                jsonGenerator.writeStartObject();
                jsonGenerator.writeObjectField(JSON_DATA_PROPERTY, page.getContent());
                jsonGenerator.writeObjectFieldStart("paging");
                jsonGenerator.writeNumberField("page", page.getNumber() + 1);
                jsonGenerator.writeNumberField("totalPages", page.getTotalPages());
                jsonGenerator.writeNumberField("totalElements", page.getTotalElements());
                jsonGenerator.writeNumberField("perPage", page.getSize());
                jsonGenerator.writeEndObject();
                jsonGenerator.writeEndObject();
            }
        });
    }
...
}

在SpringBoot 2.2.1中,此自定义的分页序列化程序已应用并可以工作。你看到这个问题了吗?

展开
收起
垚tutu 2019-12-19 16:00:41 940 分享 版权
阿里云 AI 助理回答

在Spring Boot 2.2.2及之后的版本中,Jackson库的集成和配置方式可能有所变化,这可能导致自定义序列化器不再按预期工作。以下是一些可能的原因和解决方法:

  1. Spring Boot自动配置更改:Spring Boot可能会对Jackson的自动配置进行了调整,导致你的自定义配置被覆盖或忽略。检查Spring Boot 2.2.2的更新日志或发行说明,看是否有与Jackson配置相关的变更。

  2. Jackson版本升级:你提到从Spring Boot 2.2.1升级到2.2.2时,Jackson版本也从之前的某个版本升级到了2.10.1。Jackson的新版本可能引入了行为上的改变,影响了自定义序列化器的工作方式。查看Jackson的更新日志,了解是否有相关改动。

  3. 使用@JsonComponent注解:考虑将你的序列化器类标记为@JsonComponent,这样Spring会自动发现并注册它,而不需要在配置类中显式声明为Bean。例如:

@JsonComponent
public class PageSerializer extends JsonSerializer<Page<?>> {
    // ... 实现代码
}
  1. 确保自定义模块被注册:如果继续使用配置类来注册自定义模块,请确保该配置类被正确扫描和加载。有时候,由于组件扫描的配置问题,自定义配置可能未被应用。你可以尝试在主配置类上使用@Import注解来确保你的WebConfiguration类被导入。

  2. 检查Spring Boot的Jackson定制方式:Spring Boot提供了通过WebMvcConfigurer来自定义Jackson配置的方式,但也有其他更直接的方法,比如实现Jackson2ObjectMapperBuilderCustomizer接口来定制ObjectMapper。可以尝试这种替代方案看是否能解决问题。

  3. 禁用默认的Spring Data Web分页内容 negotiation:Spring Boot可能默认启用了自己的分页内容协商机制,这可能与你的自定义序列化冲突。可以通过设置属性spring.data.web.pageable.one-indexed-parameters=true/falsespring.data.web.pageable.default-page-size等来调整或禁用。

如果以上建议都不能解决问题,建议详细查看Spring Boot和Jackson的官方文档,或者在Stack Overflow等社区寻求帮助,提供更详细的错误信息和配置细节,以便获得更具体的解决方案。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答