【问题标题】:JacksonJaxbJsonProvider default objectmapper mappingJacksonJaxbJsonProvider 默认 objectmapper 映射
【发布时间】:2016-04-11 10:26:48
【问题描述】:

我正在使用 link 中的以下代码为我的数据模型类之一添加自定义反序列化程序(JSON 到 JAXB 模型转换)。

我想将com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider 用于其他数据模型的 JSON 序列化/反序列化。

JacksonJaxbJsonProvider 的默认实现非常适合我的 JAXB 模型,其中超类作为抽象类。但是一旦我提供了自己的自定义 ObjectMapper(如下所示),就不会使用 JacksonJaxbJsonProvider 的默认实现。即为我的抽象类声明的 JAXB 注释和字段没有被 Custom ObjectMapper 正确转换,因为它找不到在抽象类中声明的字段。

所以我想根据所讨论的 JAXB 模型同时使用自定义 ObjectMapper 和 JacksonJaxbJsonProvider 的默认实现。

40  package org.glassfish.jersey.examples.jackson;
41  
42  import javax.ws.rs.ext.ContextResolver;
43  import javax.ws.rs.ext.Provider;
44  
45  import com.fasterxml.jackson.databind.AnnotationIntrospector;
46  import com.fasterxml.jackson.databind.DeserializationFeature;
47  import com.fasterxml.jackson.databind.ObjectMapper;
48  import com.fasterxml.jackson.databind.SerializationFeature;
49  import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
50  import com.fasterxml.jackson.databind.type.TypeFactory;
51  import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
52  
53  /**
54   * TODO javadoc.
55   *
56   * @author Jakub Podlesak (jakub.podlesak at oracle.com)
57   */
58  @Provider
59  public class MyObjectMapperProvider implements ContextResolver<ObjectMapper> {
60  
61      final ObjectMapper defaultObjectMapper;
62      final ObjectMapper combinedObjectMapper;
63  
64      public MyObjectMapperProvider() {
65          defaultObjectMapper = createDefaultMapper();
66          combinedObjectMapper = createCombinedObjectMapper();
67      }
68  
69      @Override
70      public ObjectMapper getContext(final Class<?> type) {
71  
72          if (type == CombinedAnnotationBean.class) {
73              return combinedObjectMapper;
74          } else {
75              return defaultObjectMapper;
76          }
77      }
78  
79      private static ObjectMapper createCombinedObjectMapper() {
80          return new ObjectMapper()
81                  .configure(SerializationFeature.WRAP_ROOT_VALUE, true)
82                  .configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true)
83                  .setAnnotationIntrospector(createJaxbJacksonAnnotationIntrospector());
84      }
85  
86      private static ObjectMapper createDefaultMapper() {
87          final ObjectMapper result = new ObjectMapper();
88          result.enable(SerializationFeature.INDENT_OUTPUT);
89  
90          return result;
91      }
92  
93      private static AnnotationIntrospector createJaxbJacksonAnnotationIntrospector() {
94  
95          final AnnotationIntrospector jaxbIntrospector = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance());
96          final AnnotationIntrospector jacksonIntrospector = new JacksonAnnotationIntrospector();
97  
98          return AnnotationIntrospector.pair(jacksonIntrospector, jaxbIntrospector);
99      }
100 }

【问题讨论】:

  • 您对过程感到困惑。 ObjectMapper 不使用提供者。 Provider 使用映射器。话虽这么说,你的问题并不完全有意义。也许语法让我感到困惑。你能试着改写这个问题吗?几乎尝试清理第三段。有点不清楚您到底要完成什么,以及为什么您提供的代码对您不起作用
  • @Meiko 你链接到了同样的问题
  • @peeskillet :-D 哦,是的……昨天太晚了……这个:stackoverflow.com/questions/18872931/…
  • @peeskillet 抱歉,我编辑了它。你能告诉我这样行吗?在那种情况下我可以解释。
  • getContext 方法是否被调用了?如果没有,您可能需要向客户端注册解析器

标签: json jersey jackson


【解决方案1】:

这个电话

.setAnnotationIntrospector(createJaxbJacksonAnnotationIntrospector());

combinedObjectMapper 添加了 JAXB 支持。因此,如果您希望 JAXB 支持 defaultObjectMapper,只需添加相同的调用即可。

final ObjectMapper result = new ObjectMapper();
result.setAnnotationIntrospector(createJaxbJacksonAnnotationIntrospector());

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 1970-01-01
    • 2011-11-28
    • 2014-11-27
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    相关资源
    最近更新 更多