春季靴子泽西杰克逊
Posted
技术标签:
【中文标题】春季靴子泽西杰克逊【英文标题】:Spring boot Jersey Jackson 【发布时间】:2015-10-19 13:27:18 【问题描述】:我有一个与 Spring Boot 项目中的 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);
谢谢
【问题讨论】:
我直接将 ObjectMapper 配置为 Bean - 而不是 Builder。你试过了吗? 【参考方案1】:为 JAX-RS/Jersey 应用程序配置 ObjectMapper
的一般方法是使用 ContextResolver
。例如
@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
。被序列化或反序列化的类/类型将传递给getContext
方法。因此,您甚至可以为不同类型甚至更多用例使用多个映射器。
更新
从 Spring Boot 1.4 开始,您可以只创建一个 ObjectMapper
Spring bean,Spring Boot 将为您创建 ContextResolver
,并使用您的 ObjectMapper
// in your `@Configuration` file.
@Bean
public ObjectMapper mapper()
【讨论】:
它有效,但我很困惑。正如我对这个解决方案的理解,我配置了 HK2 CDI 而我没有配置 Spring CDI。 我不确定我是否理解您的问题。此解决方案与 HK2 无关 好的,所以注册(新 ObjectMapperContextResolver());在 Spring CDI 而不是 Jersey CDI 中注册我的 Provider 我还是不明白你的问题是什么。 ContextResolver 是一个 JAX-RS 类。它与春天无关。如果您想将 Spring bean 注入其中,则可以根据需要将其设为 Spring 组件。例如,如果您有一个ObjectMapper
作为 Spring bean,您可以将其注入 ContextResolver。但截至目前,它仅直接用于 Jersey 及其请求处理。 Spring 从不参与。
我在我的 POJO 上为 REST Web 服务使用 jackson fasterxml 注释,并且使用 @JasonInclude(Include.NON_NULL) 没有任何区别,上面提到的答案是唯一的解决方案吗?以上是关于春季靴子泽西杰克逊的主要内容,如果未能解决你的问题,请参考以下文章
Appengine java - 泽西/杰克逊 JaxbAnnotationIntrospector NoClassDefFoundError