Подтвердить что ты не робот

Как настроить MappingJacksonHttpMessageConverter при использовании spring конфигурации на основе аннотаций?

Я был достаточно необоснован, чтобы перейти к настройке spring beans через аннотации, а не чистым xml beans, и теперь я столкнулся с последствиями.

Я настраиваю каналы REST с помощью

<mvc:annotation-driven />

Теперь я хочу просто настроить MappingJacksonHttpMessageConverter для вывода в JSON только этих полей с ненулевыми значениями. Я пробовал следующее:

<bean id="jsonHttpMessageConverter"
    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    <property name="prefixJson" value="false" />
    <property name="supportedMediaTypes" value="application/json" />
    <property name="objectMapper">
        <bean class="org.codehaus.jackson.map.ObjectMapper">
            <property name="serializationInclusion" value="NON_NULL"/>
        </bean>
    </property>
</bean>

Создается beans, но другой экземпляр конвертера создается и используется в каналах. Поэтому я пробовал путь с @Configuration и @Bean, описанным в qaru.site/info/126968/..., но все же сериализация json использует свою собственную конфигурацию.

Наконец, я попытался ввести картуп через

@Autowired
private MappingJacksonHttpMessageConverter jacksonConverter;

но я закончил с NoSuchBeanDefinitionException. Так что теперь у меня нет вариантов, и поэтому я прошу о каких-либо идеях здесь. Как управлять и настраивать картупер, используемый инфраструктурой?

4b9b3361

Ответ 1

Используйте метод WebMvcConfigurer.configureMessageConverters():

Настройте HttpMessageConverters для использования [...] Если в список не добавлены конвертеры сообщений, вместо этого будут добавлены преобразователи по умолчанию.

С @Configuration у вас есть:

@Configuration
class MvcConf extends WebMvcConfigurationSupport {
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(converter());
        addDefaultHttpMessageConverters(converters);
    }

    @Bean
    MappingJacksonHttpMessageConverter converter() {
        MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter()
        //do your customizations here...
        return converter;
    }
}

Вызов addDefaultHttpMessageConverters() требуется, поскольку значения по умолчанию не применяются при использовании пользовательских преобразователей.

ВАЖНОЕ ПРИМЕЧАНИЕ Вы должны удалить @EnableWebMvc, чтобы ваши преобразователи были настроены, если вы расширяете WebMvcConfigurationSupport.

Ответ 2

Настройка конфигурации сервлета spring mvc только в Java-коде может быть выполнена несколькими способами.

Простейший, по-видимому, расширяет ваш аннотированный класс @Configuration с помощью WebMvcConfigurerAdapter:

@Configuration
@EnableWebMvc
public class ApplicationSpringConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureMessageConverters( List<HttpMessageConverter<?>> converters ) {
        converters.add(converter());
    }

    @Bean
    MappingJackson2HttpMessageConverter converter() {
        // [...]
    }
}

Обратите внимание, что это очень похоже на пример, предоставленный ответом Томаша Нуркевича.

Однако использование WebMvcConfigurationSupport вместо WebMvcConfigurerAdapter более подходит для расширенных настроек. Это было так, если вам нужно было также добавить преобразователи по умолчанию.

См. документацию spring Настройка предоставленной конфигурации