春季靴子泽西杰克逊

时间:2015-07-28 19:42:30

标签: json spring jersey spring-boot

我在Spring启动项目中有一个与Jackson配置相关的问题

spring boot blog

所述

我尝试自定义对象序列化。

在我的配置中添加了一个新的配置bean

@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();

    builder.propertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
    return builder;
}

当我尝试输出我的类User的实例时,json结果不在CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

Class User {
    private String firstName = "Joe Blow";

    public String getFirstName() {
        return firstName;
    }
}

json输出是:

{
  "firstName": "Joe Blow"
}

而不是

{
  "first_name": "Joe Blow"
}

也许我需要在Jersey配置中注册一些东西来激活我的自定义obejctMapper配置

@Configuration
public class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        packages("my.package);
    }
}

谢谢

1 个答案:

答案 0 :(得分:11)

为JAX-RS / Jersey应用程序配置tomcat/webapps/alfresco/WEB-INF/lib的一般方法是使用ContextResolver。例如

ObjectMapper

应该使用包扫描来获取它,或者如果它不在包范围内,您可以显式注册它

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {

    private final ObjectMapper mapper;

    public ObjectMapperContextResolver() {
        mapper = new ObjectMapper();
        mapper.setPropertyNamingStrategy(
            PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
        );
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return mapper;
    }
}

在编组和解组期间调用public JerseyConfig() { register(new ObjectMapperContextResolver()); // Or if there's is an injection required // register it as a .class instead of instance } 。被序列化或反序列化的类/类型将被传递给ContextResolver方法。因此,您甚至可以为不同类型使用多个映射器,甚至可以使用更多用例。

更新

从Spring Boot 1.4开始,您只需创建一个getContext Spring bean,Spring Boot将为您创建ObjectMapper,并使用您的ContextResolver

ObjectMapper