java - 为某些包 Spring MVC 设置不同的 ObjectMapper

标签 java spring spring-mvc jackson

有没有办法使用 spring 为我的项目中的某些包设置 HttpMessageConverter?

@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。

最佳答案

这里是 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;
    }
}

关于java - 为某些包 Spring MVC 设置不同的 ObjectMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31925235/

相关文章:

java - OpenCV android函数使用

spring - 未找到 HTTP 请求的映射 (Spring MVC)

JavaIO异常: Negative seek offset

java - 如何以 : filepath (int, int) (int,int) 格式编写 java 模式?

java - Java(任何框架)中是否有 CRUD 生成器实用程序,例如 Rails 中的脚手架?

spring - 如何使用用户定义的偏移量和限制(范围)通过 Spring 数据 JPA 查询数据

java - Spring Boot - "Error creating bean with name ' entityManagerFactory'"- 开始

spring - 如何从@Bean返回一个依赖于其他bean的bean

java - 发送邮件在 Spring/Maven/Java 6 环境中不起作用

java - 作为 Spring bean 的 Vaadin 组件