私はこのlinkのコードを使用して、自分のデータモデルクラス(JSONからJAXBモデルへの変換)のカスタムデシリアライザを追加しています。JacksonJaxbJsonProviderデフォルトのオブジェクトマッパーマッピング
com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider
を使用して、他のデータモデルのJSONシリアル化/デシリアライゼーションに使用します。
デフォルト実装のJacksonJaxbJsonProvider
は、抽象クラスとしてスーパークラスを持つJAXBモデルでは完全に機能します。しかし、自分のカスタムObjectMapper(以下に示す)を用意したら、JacksonJaxbJsonProvider
のデフォルトの実装は使用されません。つまり、抽象クラスで宣言されたフィールドが見つからないため、抽象クラス用に宣言されたJAXB注釈とフィールドは、カスタムObjectMapperによって正しく変換されません。
私はカスタムObjectMapperとデフォルトの実装JacksonJaxbJsonProvider
を同時に使用したいと思います。問題のJAXBモデルに応じて。
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はプロバイダを使用しません。プロバイダはマッパーを使用します。あなたの質問は完全に意味をなさないと言われています。多分、文法が私を混乱させているのかもしれない。あなたはその質問を試して言い換えることができますか?かなり第三段落をきれいにしようとする。あなたが達成しようとしていることと、なぜあなたが提供したコードがうまくいかないのかが少し不明です。 –
@Meikoあなたはこの同じ質問にリンクしました –
@peeskillet :-D oh yes ...昨日遅すぎました..この1つ:http://stackoverflow.com/questions/18872931/custom-objectmapper-with-jersey-2-2-and-jackson-2-1 –