JacksonJaxbJsonProvider 默认对象映射器映射
JacksonJaxbJsonProvider default objectmapper mapping
我正在使用此 link 中的以下代码为我的数据模型之一添加自定义反序列化器 class(JSON 到 JAXB 模型的转换)。
我想将 com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider
用于我的 JSON serialization/de-serialization 用于其他数据模型。
JacksonJaxbJsonProvider
的默认实现非常适合我的 JAXB 模型,其中超级 class 作为抽象 class。但是一旦我提供了自己的自定义 ObjectMapper(如下所示),就不会使用 JacksonJaxbJsonProvider
的默认实现。即,为我的抽象 class 声明的 JAXB 注释和字段未被 Custom ObjectMapper 正确转换,因为它找不到在抽象 class.
中声明的字段
所以我想根据所讨论的 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 }
这次通话
.setAnnotationIntrospector(createJaxbJacksonAnnotationIntrospector());
是为 combinedObjectMapper
添加 JAXB 支持的原因。因此,如果您希望 JAXB 支持 defaultObjectMapper
,只需添加相同的调用即可。
final ObjectMapper result = new ObjectMapper();
result.setAnnotationIntrospector(createJaxbJacksonAnnotationIntrospector());
我正在使用此 link 中的以下代码为我的数据模型之一添加自定义反序列化器 class(JSON 到 JAXB 模型的转换)。
我想将 com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider
用于我的 JSON serialization/de-serialization 用于其他数据模型。
JacksonJaxbJsonProvider
的默认实现非常适合我的 JAXB 模型,其中超级 class 作为抽象 class。但是一旦我提供了自己的自定义 ObjectMapper(如下所示),就不会使用 JacksonJaxbJsonProvider
的默认实现。即,为我的抽象 class 声明的 JAXB 注释和字段未被 Custom ObjectMapper 正确转换,因为它找不到在抽象 class.
所以我想根据所讨论的 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 }
这次通话
.setAnnotationIntrospector(createJaxbJacksonAnnotationIntrospector());
是为 combinedObjectMapper
添加 JAXB 支持的原因。因此,如果您希望 JAXB 支持 defaultObjectMapper
,只需添加相同的调用即可。
final ObjectMapper result = new ObjectMapper();
result.setAnnotationIntrospector(createJaxbJacksonAnnotationIntrospector());