2016-04-11 4 views
1

私はこの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 } 
+1

あなたはプロセスが混乱しています。 ObjectMapperはプロバイダを使用しません。プロバイダはマッパーを使用します。あなたの質問は完全に意味をなさないと言われています。多分、文法が私を混乱させているのかもしれない。あなたはその質問を試して言い換えることができますか?かなり第三段落をきれいにしようとする。あなたが達成しようとしていることと、なぜあなたが提供したコードがうまくいかないのかが少し不明です。 –

+0

@Meikoあなたはこの同じ質問にリンクしました –

+0

@peeskillet :-D oh yes ...昨日遅すぎました..この1つ:http://stackoverflow.com/questions/18872931/custom-objectmapper-with-jersey-2-2-and-jackson-2-1 –

答えて

1

このコール

.setAnnotationIntrospector(createJaxbJacksonAnnotationIntrospector()); 

combinedObjectMapperのためのJAXBのサポートを追加するものです。したがって、defaultObjectMapperのJAXBサポートを希望する場合は、同じ呼び出しを追加するだけです。

final ObjectMapper result = new ObjectMapper(); 
result.setAnnotationIntrospector(createJaxbJacksonAnnotationIntrospector()); 
関連する問題