Нулевые значения, возвращаемые с использованием WebMvcConfigurationSupport вместо WebMvcConfigurerAdapter - PullRequest
0 голосов
/ 04 июня 2019

Поскольку WebMvcConfigurerAdapter устарел с весны 5.0, я изменил его на WebMvcConfigurationSupport, но в ответ я получаю нулевые значения.

{
"key": null,
"value": null,
"name":"test"
}

Если я изменю его обратно на WebMvcConfigurerAdapter, я получу ожидаемый ответ:

{
"name":"test"
}

Весенняя версия: 5.7.0 Джексон Версия: 2.9.7

Я много гуглил, но все равно не повезло. Я не хочу использовать устаревший класс. Попытался удалить аннотацию @EnableWebMvc после добавления WebMvcConfigurationSupport, так как он не требуется.

Я переопределил configureMessageConverters, где я настраиваю MappingJackson2HttpMessageConverter с включением NOT_NULL

@Configuration
@EnableAspectJAutoProxy
@EnableSwagger2
@PropertySource("classpath:test.properties")
@ComponentScan(basePackages = {"com.test.web"})
public class UmwWebConfig extends WebMvcConfigurationSupport {

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        ByteArrayHttpMessageConverter bahHumbug = new ByteArrayHttpMessageConverter();
        bahHumbug.setSupportedMediaTypes(Collections.singletonList(MediaType.parseMediaType("application/pdf")));
        converters.add(bahHumbug);

        final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        final ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        objectMapper.getFactory().configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        converter.setObjectMapper(objectMapper);
        converters.add(converter);
        super.configureMessageConverters(converters);
    }

Хотите удалить пустые поля из ответа. Пожалуйста, дайте мне знать, если что-то не так в конфигурации.

1 Ответ

1 голос
/ 04 июня 2019

Не расширяйте WebMvcConfigurationSupport, поскольку это не эквивалентно расширению устаревшей WebMvcConfigurerAdapter.

Вместо реализации WebMvcConfigurer, что также предлагается в документации по устаревшей документации в javadocWebMvcConfigurerAdapter .

устарело. с версии 5.0 WebMvcConfigurer имеет методы по умолчанию (стало возможным благодаря базовой версии Java 8) и может быть реализовано напрямую без необходимостидля этого адаптера

Таким образом, заголовок вашего класса конфигурации должен выглядеть примерно так:

@Configuration
@EnableAspectJAutoProxy
@EnableSwagger2
@EnableWebMvc
@PropertySource("classpath:test.properties")
@ComponentScan(basePackages = {"com.test.web"})
public class UmwWebConfig implements WebMvcConfigurer { ... }

Вам необходимо снова добавить @EnableWebMvc (как следует) и переопределить / реализовать интерфейсметод, который вам нужно использовать. В этом случае, вероятно, только один.

PRO-TIP: Используйте Jackson2ObjectMapperBuilder для построения ObjectMapper и используйте конструктор MappingJackson2HttpMessageConverter. Это сохраняет создание дополнительного ObjectMapper (что происходит в конструкторе по умолчанию).

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        ByteArrayHttpMessageConverter bahHumbug = new ByteArrayHttpMessageConverter();
        bahHumbug.setSupportedMediaTypes(Collections.singletonList(MediaType.parseMediaType("application/pdf")));
        converters.add(bahHumbug);

        final ObjectMapper objectMapper = 
          Jackson2ObjectMapperBuilder.json()
            .serializationInclusion(JsonInclude.Include.NON_NULL)
            .failOnUnknownProperties(true)
            .featuresToEnable(JsonGenerator.Feature.ESCAPE_NON_ASCII)
            .build();       

        converters.add(new MappingJackson2HttpMessageConverter(objectMapper);
        super.configureMessageConverters(converters);
    }
...