0

我想在 WebMVC 中覆盖 Spring RestController 中的以下属性。

objectMapper.setSerializationInclusion(Include.NON_NULL);
objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
objectMapper.setDateFormat(DATEFORMAT);

我在多种组合中尝试了以下方法,但没有任何效果。仍然在响应中获得没有根名称的空值。

@EnableWebMvc
public class ApplicationContextConfig extends WebMvcConfigurerAdapter {

     @Override
     public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.setSerializationInclusion(Include.NON_NULL);
        objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
        objectMapper.setDateFormat(DATEFORMAT);
        //jsonConverter.setObjectMapper(objectMapper);
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(objectMapper);
        //jsonConverter.setJsonPrefix(jsonPrefix);
        converters.add(jsonConverter);
     }

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter<?> converter : converters) {
            if (converter instanceof MappingJackson2HttpMessageConverter) {
                MappingJackson2HttpMessageConverter jsonMessageConverter = (MappingJackson2HttpMessageConverter) converter;
                ObjectMapper objectMapper = jsonMessageConverter.getObjectMapper();
                objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
                objectMapper.setSerializationInclusion(Include.NON_NULL);
                objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
                objectMapper.setDateFormat(DATEFORMAT);
                break;
            }
        }
    }

    @Bean
    @Primary
    public ObjectMapper getObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(Include.NON_NULL);
        objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
        objectMapper.setDateFormat(DATEFORMAT);
        return objectMapper;
    }
}

回应:

{
    "Message": null,
    "Admin": null,
    "Company": null
}
4

1 回答 1

0

你应该用你自己的“替换”spring提供的对象映射器bean并配置它。

@Configuration
public class MyJacksonCustomConfiguration {

    @Bean
    public ObjectMapper objectMapper() { // note the name should be 'objectMapper'
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(Include.NON_NULL);
        objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
        objectMapper.setDateFormat(DATEFORMAT);        
        return objectMapper;
    }
}

总而言之,确保只有一个对象映射器类型的 bean 应该存在于应用程序上下文中。除了它是一个相当“重”的对象之外,如果 spring 会注入一个错误的映射器,你将无法从你已经完成的定制中受益。

于 2019-11-25T06:04:18.900 回答