首页 > 解决方案 > 自定义 HttpMessageConverter - configureMessageConverters / extendMessageConverters

问题描述

如果在请求中发送了任何未知属性,我需要使 POST 请求失败,因此我创建了一个自定义 MappingJackson2HttpMessageConverter,但我很想了解我是否以正确的方式执行此操作,或者是否有更好的选择。

@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(mappingJackson2HttpMessageConverter());
    }

    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = jsonConverter.getObjectMapper();
        objectMapper.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        jsonConverter.setObjectMapper(objectMapper);
        return jsonConverter;
    }


}

所以在这里,我创建了一个新的 MappingJackson2HttpMessageConverter 并让转换器在找到未知属性时失败,然后将其添加到 messageConverters 列表中。通过阅读此“WebMvcConfigurer”类,它指出:

Note: that adding converters to the list, turns off default converter registration. 
To simply add a converter without impacting default registration, consider 
using the method @link #extendMessageConverters(java.util.List)} instead.
default void configureMessageConverters(List<HttpMessageConverter<?>> converters){}

因此,据我了解,我现在将丢失以前可用的任何默认消息转换器(这可能会对我的应用程序的其他地方产生一些影响?)。

我注意到这个 WebMvcConfigurer 接口中有另一个默认方法,称为“extendMessageConverters”,它说:

A hook for extending or modifying the list of converters after it has been
configured. This may be useful for example to allow default converters to
be registered and then insert a custom converter through this method.
default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
}

我试图然后覆盖'extendMessageConverters':

@Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(0, mappingJackson2HttpMessageConverter());
    }

在这里,我已将 mappingJackson2HttpMessageConverter 添加到索引 0,如文档所述'Note that the order of converter registration is important'https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/ WebMvcConfigurer.html )

处理这种情况时,最好/推荐的方法是什么?这两种方法都有效,并且拒绝我的 post 请求中与相应 POJO 不匹配的任何 JSON。我是这种配置的新手,所以我觉得扩展消息转换器是最好的方法,以防万一我在我的应用程序的其他地方使用默认转换器之一而我没有注意到。关于我所做的任何建议/改进?

标签: javaspringspring-bootspring-mvc

解决方案


推荐阅读