春季靴子泽西杰克逊

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

xml 春季靴子

春季靴子没有从百里香叶返回值

在春季靴子2什么是最有效的登录身体的方式?

杰克逊映射无限递归。春季数据休息

传递 POST 请求。春季安全。休息模板。杰克逊转换器