31

我不合理地通过注释而不是纯 xml bean 来配置 spring bean,现在我正面临着后果。

我使用配置 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>

bean 被创建,但另一个转换器实例被创建并在通道中使用。所以我尝试了这个 Stackoverflow question@Configuration@Bean描述的方法,但 json 序列化仍然使用它自己的配置。

最后我尝试通过注入映射器

@Autowired
private MappingJacksonHttpMessageConverter jacksonConverter;

但我已经结束了NoSuchBeanDefinitionException。所以现在我别无选择,因此我在这里寻求任何想法。如何控制和配置框架使用的映射器?

4

3 回答 3

63

使用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;
    }
}

调用 toaddDefaultHttpMessageConverters()是必需的,因为使用自定义转换器时不应用默认值。

重要说明如果您扩展 WebMvcConfigurationSupport,则 必须删除@EnableWebMvc才能配置您的转换器。

于 2012-05-18T09:55:46.583 回答
27

仅在 java 代码中自定义 spring mvc servlet 配置可以通过多种方式完成。

最简单的似乎是扩展您的@Configuration带注释的类WebMvcConfigurerAdapter

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

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

请注意,这很像Tomasz Nurkiewicz的答案提供的示例。

但是,使用WebMvcConfigurationSupport而不是WebMvcConfigurerAdapter更适合高级自定义。如果您还需要添加默认转换器,情况就是如此。

请参阅 Spring 文档自定义提供的配置

于 2013-04-19T12:25:43.447 回答
-1

以下解决方案适用于 Spring 4.3(非引导),需要fetch=FetchType.LAZY通过向 Jackson 转换器添加模块来解决该问题。可以使用类似的技术以任何方式修改转换器,包括删除和重新创建。

@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter {

@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {

    for (HttpMessageConverter<?> mc : converters){
         if (mc instanceof MappingJackson2HttpMessageConverter || mc instanceof MappingJackson2XmlHttpMessageConverter) {
            ((AbstractJackson2HttpMessageConverter) mc).getObjectMapper().registerModule(new Hibernate5Module());
        }
    }
    return;
 }

在这种情况下,

  • 其中WebMvcConfigurerAdapter有很多其他配置,我想避免使用另一个配置类。
  • 使用extendMessageConverters对自动配置的 Jackson 类的启用访问,而不会丢失所有其他消息转换器的配置,这就是configureMessageConverters应该做的。
  • 使用registerModule您可以简单地将所需的内容添加Hibernate5Module到现有转换器中。
  • 该模块已添加到 JSON 和 XML 处理器中
于 2019-01-14T22:20:18.537 回答