2016-10-21 3 views
0

私はすでに同様のものを投稿しましたが、私はまだ私の問題をゼロにしようとしています。ジャクソンミックスインが呼び出されていない

私と一緒にお越しいただきありがとうございます。

ジャクソンはmixinを呼び出す必要がないと思われますが、私はその理由を伝えられません。

"要素"はクラスではないインターフェイスです。ミックスイン(下記)に示すように、通常は静的ファクトリコールでインスタンス化されます。私が理解しているところでは、JacksonがInterface:Element.classを見ると、mixinを検索して@JsonCreatorアノテーションを持つメソッドを実行する必要があります。これのどれも起こっていない。もしそうなら、私はロガーからの出力を見るでしょう。その代わりに、エラーメッセージ(下のように)で見ることができるように、jacksonは自分のインターフェースをクラスとして扱うようにしています。

なぜ私のmixinは機能しませんか?ここで

はミックスインです:

public class ElementMixin { 

     private static Logger log = LoggerFactory.getLogger(ElementMixin.class); 

     @JsonCreator 
     public static Element create() { 
      log.error("Element==>"); 
      return FhirFactory.eINSTANCE.createElement(); 
     } 
     } 

は、ここで私はマッパーに登録方法は次のとおりです。

// Instantiate my interface, put some data in and serialize. 
Element ela = FhirFactory.eINSTANCE.createElement(); 
ela.setId("CBAEL"); 
StringWriter writer = new StringWriter(); 
mapper.writeValue(writer, ela); 

// Now try to deserialize into a new instance. 
StringReader reader = new StringReader(writer.toString()); 
Element elp = mapper.readValue(reader, Element.class);//Error thrown 
assertNotNull(elp); 

エラー:

ObjectMapper mapper = new ObjectMapper(); 
    mapper.addMixIn(Element.class, ElementMixin.class); 

は、ここで私は物事を実行している方法です

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of fhir.Element, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information at [Source: [email protected]; line: 1, column: 1] at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:255) at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1007) at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:150) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3807) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2844) at gov.nist.forecast.fhir.resources.IndexResourceTest.testParametersJSON(IndexResourceTest.java:173)

答えて

0

ミックスインはアノテーションのみを関連付けます。フィールドやメソッドを追加することはできません。バイトコードの生成や操作は追加されません。したがって、ターゲットに既に存在するメソッド(静的ファクトリメソッドを含む)を使用する必要があることを示すアノテーションを追加することはできますが、ミックスインで定義されたものは何も呼び出されず、使用されることもありません。

+0

「アノテーションの関連付け」の意味が不明です。 –

+0

フィールドやメソッドを追加するとは思わない。私が望むのは、jacksonが登録されたインターフェイスを見るたびに適切なファクトリメソッド(コンストラクタとは対照的に)を呼び出すことだけです。私は変更できないサードパーティのlibに646個あります。この投稿によると、それは動作するはずです[リンク] http://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html [リンク] –

+0

@GeoffryRobertsので、ターゲットクラスには一致するファクトリメソッドがありますか?そうなら、それはうまくいくはずです。ミックスインクラスの静的メソッドが呼び出されると予想していましたが、これは私の説明によれば起こりません - ミックスインクラスはATのすべてで使用されていませんが、注釈をチェックする場合を除いて "クラスは持っています。 – StaxMan

関連する問題