2

まず、私は JAXB と Spring の世界では初心者なので、非常に明白な何かを見逃した場合は、返信せずに誰かが指摘してくれると本当にありがたいです。:)ここで解決策を探してみましたが、良い答えが見つかりませんでした。

同じ抽象クラス A から継承するサブクラス DTO (A1、A2、A3 など) がたくさんあります。残りのクエリの結果がサブクラス型のリストを返すようにします。結果を表す次のクラスがあります

@XmlRootElement(name="result")
@XmlSeeAlso({A1.class, A2.class, A3.class})
public class AResult<T> 
{
...
}

AResult はジェネリックなので、 @XmlSeeAlso もジェネリックにして、次のように記述したいと思います

@XmlSeeAlso({(subclasses of A.class})

しかし、私がこのサイトや他の場所で行った調査から、JAXB でそれが可能であるとは思えません。

  1. 設定で注釈駆動型タグを使用するため、Jaxb2RootElementHttpMessageConverter クラスが自動的に使用されます。このメッセージ コンバーターは、特に @XmlSeeAlso で定義されたクラスを使用して JaxbContext を作成します。createMarshaller メソッドと getContext メソッドは、スーパークラスでは不変です。

  2. ポイント 1 のため、クラスがクラス A のサブクラスであるかどうかを確認してから JaxbContext に追加できるクラスを作成することはできません。カスタム Jaxb2RootElementHttpMessageConverter またはカスタム Marshaller を使用できません。

どうすればこれを回避できますか? ところで、Spring バージョン 3.1.3 を使用しています。

ご協力いただきありがとうございます。

4

1 に答える 1

2

JAXB はクラスパスをスキャンして、たまたまそのサブクラスである可能性がAResultあるクラスを探しません(これはかなり遅くなります! )。注釈が行うことは、@XmlSeeAlsoリストされた追加のクラスでコンテキストを拡張することだけです。

ただし、他にもいくつかのアプローチがあります。たとえば@XmlRegistry、関心のあるサブクラスを作成する方法を知っている でマークされたクラスを作成できます。または、 を使用して実験することもできます@XmlJavaTypeAdapter@XmlSeeAlso悲しいかな、私は自分のコードでベースのアプローチを使用するところまでしか進歩していないので、実際の経験からコメントすることはできません.

于 2013-02-13T20:27:01.817 に答える