1

次のコードがあります。

private SetMultimap<String, Dynamic> dynamicFields = TreeMultimap.create(Ordering.natural(), new Comparator<Dynamic>() {
  @Override
  public int compare(Dynamic o1, Dynamic o2) {
   return o1.getTitle().compareTo(o2.getTitle());
  }
 });

これにより、次の例外が発生します。

IllegalAnnotationsException SetMultimap is an interface, and JAXB can't handle interfaces

私の質問は、なぜこれが機能しないのかということですが、これは機能します:

List<Dynamic> test = new ArrayList<Dynamic>();

また、JAXB が満足するように SetMultimap を修正するにはどうすればよいでしょうか?

4

2 に答える 2

1

List/ArrayList と SetMultimap の違いは、一方が Java コレクションであり、もう一方が通常の Java コレクション階層外のデータ構造であることです。これは、JAXB がそれを通常のクラスと見なすことを意味します。

JAXB 仕様はインターフェースをサポートしていません。インターフェイスをサポートしていない Metro JAXB 実装を使用している可能性があります。MOXyなどの一部の JAXB 実装はインターフェースをサポートできますが、一部の JAX-WS 実装は特定の JAXB impl に依存しており、JAXB 実装を置き換えることが常に可能であるとは限りません。

最善の策は、パラメーター レベルの注釈を使用して SetMultimap を JAXB で処理できるクラスに変換することです。

于 2010-08-16T19:41:44.207 に答える
1

次のように、アノテーションを追加して、参照の可能なランタイム タイプを JAXB に伝える必要があります。

@XmlElements({
@XmlElement(type = TreeMultimap.class, name = "treeMultimap"),
@XmlElement(type = MultiHashMap.class, name = "hashMultimap")
})
private SetMultimap<String, Dynamic> dynamicFields = TreeMultimap.create(Ordering.natural(), new Comparator<Dynamic>() {
  @Override
  public int compare(Dynamic o1, Dynamic o2) {
    return o1.getTitle().compareTo(o2.getTitle());
  }
});

上記のコードでは、必要に応じてフィールドを MultiHashMap のインスタンスに置き換えることもできます。@XmlElement可能なランタイム タイプごとに を追加する必要があります。ハッシュ マルチマップを使用しない場合は、次のもの@XmlElementTreeMultimap.class十分です。

@XmlElement(type = TreeMultimap.class, name = "treeMultimap")
private SetMultimap<String, Dynamic> dynamicFields = TreeMultimap.create(Ordering.natural(), new Comparator<Dynamic>() {
  @Override
  public int compare(Dynamic o1, Dynamic o2) {
    return o1.getTitle().compareTo(o2.getTitle());
  }
});
于 2010-08-13T12:38:37.093 に答える