如何在使用基于弹簧注释的配置时配置MapingJacksonHttpMessageConverter?

2022-09-01 10:10:24

我太不合理了,以至于通过注释而不是纯xml bean来配置spring bean,现在我面临着后果。

我使用以下命令配置 REST 通道

<mvc:annotation-driven />

现在,我只想将 配置为仅将此字段输出到 JSON 具有非空值。我尝试了以下方法:MappingJacksonHttpMessageConverter

<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问题中所述的方法,但是json序列化仍然使用自己的配置。@Configuration@Bean

最后,我尝试通过以下方式注入映射器

@Autowired
private MappingJacksonHttpMessageConverter jacksonConverter;

但我以.所以现在我没有选择,因此我在这里要求任何想法。如何控制和配置框架使用的映射器?NoSuchBeanDefinitionException


答案 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()

重要提示如果扩展 WebMvcConfigurationSupport,则必须删除才能配置转换器。@EnableWebMvc


答案 2

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

最简单的一个似乎是用扩展带注释的类:@ConfigurationWebMvcConfigurerAdapter

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

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

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

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

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


推荐