Java SpringBoot 2.2.2:用于自定义分页的Jackson序列化程序不';行不通

Java SpringBoot 2.2.2:用于自定义分页的Jackson序列化程序不';行不通,java,spring,spring-boot,serialization,jackson,Java,Spring,Spring Boot,Serialization,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 St

从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();
            }
        });
    }
...
}
/**
*此类允许指定与Web MVC部件相关的配置。
*/
@配置
公共类WebConfiguration实现WebMVCConfiguer{
私有静态最终字符串JSON_DATA_PROPERTY=“DATA”;
/**
*允许为分页配置{@link JsonSerializer}。
*
*@返回{@link Module}的实例。
*/
@抑制警告(“原始类型”)
@豆子
公共模块springDataPageModule(){
返回新的SimpleModule(){
@凌驾
公共无效序列化(最终页面、最终JsonGenerator JsonGenerator、,
最终SerializerProvider序列化程序)引发IOException{
jsongGenerator.writeStartObject();
jsonGenerator.writeObjectField(JSON_数据_属性,page.getContent());
jsongGenerator.writeObjectFieldStart(“分页”);
jsongGenerator.WriteEnumberField(“page”,page.getNumber()+1);
jsonGenerator.WriteEnumberField(“totalPages”,page.getTotalPages());
jsonGenerator.WriteEnumberField(“totalElements”,page.getTotalElements());
jsonGenerator.WriteEnumberField(“perPage”,page.getSize());
jsongGenerator.writeEndObject();
jsongGenerator.writeEndObject();
}
});
}
...
}
在SpringBoot 2.2.1中,这个自定义分页序列化程序被应用并工作。
您看到这个问题了吗?

自SpringBoot 2.2.2以来,行为发生了变化。 你必须完成模块的注册

/**
 * 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}.
     */
    private Module preparePageModule() {
        return new SimpleModule().addSerializer(Page.class, new JsonSerializer<>() {
            @Override
            public void serialize(@SuppressWarnings("rawtypes") 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();
            }
        });
    }

    /**
     * Allows to configure the Jackson object mapper.
     *
     * @param objectMapper
     *            an instance of {@link ObjectMapper}.
     */
    @Autowired
    public void configureJacksonObjectMapper(final ObjectMapper objectMapper) {
        ...
        objectMapper.registerModule(preparePageModule());
    }
...
}
`
/**
*此类允许指定与Web MVC部件相关的配置。
*/
@配置
公共类WebConfiguration实现WebMVCConfiguer{
私有静态最终字符串JSON_DATA_PROPERTY=“DATA”;
/**
*允许为分页配置{@link JsonSerializer}。
*
*@返回{@link Module}的实例。
*/
专用模块preparePageModule(){
返回新的SimpleModule(){
@凌驾
public void serialize(@SuppressWarnings(“rawtypes”)最终页面,最终JsonGenerator JsonGenerator,
最终SerializerProvider序列化程序)引发IOException{
jsongGenerator.writeStartObject();
jsonGenerator.writeObjectField(JSON_数据_属性,page.getContent());
jsongGenerator.writeObjectFieldStart(“分页”);
jsongGenerator.WriteEnumberField(“page”,page.getNumber()+1);
jsonGenerator.WriteEnumberField(“totalPages”,page.getTotalPages());
jsonGenerator.WriteEnumberField(“totalElements”,page.getTotalElements());
jsonGenerator.WriteEnumberField(“perPage”,page.getSize());
jsongGenerator.writeEndObject();
jsongGenerator.writeEndObject();
}
});
}
/**
*允许配置Jackson对象映射器。
*
*@param objectMapper
*{@link ObjectMapper}的实例。
*/
@自动连线
公共void配置JacksonObject映射器(最终对象映射器对象映射器){
...
registerModule(preparePageModule());
}
...
}
`