为某些软件包Spring MVC设置一个不同的ObjectMapper [英] Set a different ObjectMapper for certain package Spring MVC

查看:285
本文介绍了为某些软件包Spring MVC设置一个不同的ObjectMapper的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有一种方法可以使用spring为我项目中的某些软件包设置HttpMessageConverter?

Is there a way to set a HttpMessageConverter for only certain packages in my project using spring?

@Configuration
@EnableWebMvc
@ComponentScan(basePackageClasses = MyConfig.class)
public class MyConfig
    extends WebMvcConfigurerAdapter {

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

        for (HttpMessageConverter<?> converter : converters) {
            if (converter instanceof MappingJacksonHttpMessageConverter) {
                ObjectMapper objectMapper = new ObjectMapper();
                objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
                objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
                objectMapper.setSerializationInclusion(Inclusion.NON_NULL);
                ((MappingJacksonHttpMessageConverter) converter).setObjectMapper(objectMapper);
            }
        }
    }

使用此PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES,更改项目中的所有响应,我希望此方法仅适用于某些dto.

Using this PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES, changes all responses in project and I want this to apply only in some dto.

推荐答案

下面是hzpz提出的解决方案示例:

Here an example of the solution propose by hzpz :

自定义转换器:

public class CustomConverter extends MappingJackson2HttpMessageConverter {

    private String basePackage;

    public CustomConverter(String basePackage) {
        this.basePackage = basePackage;
    }

    @Override
    public boolean canRead(Type type, Class<?> contextClass, MediaType mediaType) {
        if (contextClass.getName().startsWith(basePackage)) {
            return super.canRead(type, contextClass, mediaType);
        }
        return false;
    }

    @Override
    public boolean canWrite(Class<?> clazz, MediaType mediaType) {
        if (clazz.getName().startsWith(basePackage)) {
            return super.canWrite(clazz, mediaType);
        }
        return false;
    }
}

配置

@Configuration
public class CustomConfig {

    @Bean
    public MappingJackson2HttpMessageConverter firstConverter() {
        MappingJackson2HttpMessageConverter converter = new CustomConverter("package.camel");
        converter.setObjectMapper(firstObjectMapper());
        return converter;
    }

    @Bean
    public MappingJackson2HttpMessageConverter secondConverter() {
        MappingJackson2HttpMessageConverter converter = new CustomConverter("package.snake");
        converter.setObjectMapper(secondObjectMapper());
        return converter;
    }

    @Bean
    public ObjectMapper firstObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
        return mapper;
    }

    @Bean
    public ObjectMapper secondObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
        return mapper;
    }
}

这篇关于为某些软件包Spring MVC设置一个不同的ObjectMapper的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆