Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JacksonJaxbJsonProvider默认对象映射器映射_Json_Jersey_Jackson - Fatal编程技术网

JacksonJaxbJsonProvider默认对象映射器映射

JacksonJaxbJsonProvider默认对象映射器映射,json,jersey,jackson,Json,Jersey,Jackson,我使用下面的代码为我的一个数据模型类(JSON到JAXB模型转换)添加自定义反序列化程序 我想使用com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider对其他数据模型进行json序列化/反序列化 JacksonJaxbJsonProvider的默认实现非常适用于我的JAXB模型,将超类作为抽象类。但是,一旦我提供了自己的定制ObjectMapper(如下所示),就不会使用默认的JacksonJaxbJsonProvider实现。i、 自定

我使用下面的代码为我的一个数据模型类(JSON到JAXB模型转换)添加自定义反序列化程序

我想使用
com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider
对其他数据模型进行json序列化/反序列化

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

因此,我希望根据所讨论的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 }
40 package org.glassfish.jersey.examples.jackson;
41
42导入javax.ws.rs.ext.ContextResolver;
43导入javax.ws.rs.ext.Provider;
44
45导入com.fasterxml.jackson.databind.annotationIntroSector;
46导入com.fasterxml.jackson.databind.DeserializationFeature;
47导入com.fasterxml.jackson.databind.ObjectMapper;
48导入com.fasterxml.jackson.databind.SerializationFeature;
49导入com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
50导入com.fasterxml.jackson.databind.type.TypeFactory;
51导入com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
52
53  /**
54*TODO javadoc。
55   *
56*@作者Jakub Podlesak(oracle.com上的Jakub.Podlesak)
57   */
58@Provider
59公共类MyObjectMapperProvider实现ContextResolver{
60
61最终对象映射器defaultObjectMapper;
62最终对象映射器组合对象映射器;
63
64公共MyObjectMapperProvider(){
65 defaultObjectMapper=createDefaultMapper();
66 combinedObjectMapper=createCombinedObjectMapper();
67      }
68
69@Override
70公共ObjectMapper getContext(最终类类型){
71
72如果(类型==CombinedAnnotationBean.class){
73返回组合对象映射器;
74}其他{
75返回默认对象映射器;
76          }
77      }
78
79私有静态对象映射器createCombinedObjectMapper(){
80返回新的ObjectMapper()
81.配置(SerializationFeature.WRAP\u ROOT\u值,true)
82.配置(反序列化功能。展开根值,true)
83.setAnnotationIntrospector(createJaxbJacksonAnnotationIntrospector());
84      }
85
86私有静态对象映射器createDefaultMapper(){
87最终ObjectMapper结果=新ObjectMapper();
88结果.启用(序列化特性.缩进输出);
89
90返回结果;
91      }
92
93专用静态注释导入器createJaxbJacksonAnnotationIntrospector(){
94
95 final AnnotationIntrospector jaxbIntrospector=新的JaxbAnnotationIntrospector(TypeFactory.defaultInstance());
96最终注释Introspector jacksonIntrospector=新JacksonAnnotationIntrospector();
97
98返回注释introspector.pair(jacksonIntrospector、jaxbIntrospector);
99      }
100 }
此呼叫

.setAnnotationIntrospector(createJaxbJacksonAnnotationIntrospector());
是什么增加了JAXB对
组合对象映射器的支持。因此,如果希望JAXB支持
defaultObjectMapper
,只需添加相同的调用即可

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

你把这个过程弄糊涂了。ObjectMapper不使用提供程序。提供程序使用映射器。话虽如此,你的问题并不完全有道理。也许语法把我弄糊涂了。你能试着重新措辞这个问题吗。尽量把第三段整理干净。有点不清楚您到底想要完成什么,以及为什么您提供的代码无法工作you@Meiko你也链接到了这个question@peeskillet:-D哦,是的。。。昨天太晚了。。。这个:@peeskillet抱歉我编辑了它。你能告诉我这样行吗?在这种情况下我可以解释。是否调用了
getContext
方法?如果没有,您可能需要向客户端注册冲突解决程序