java.util.Listはインタフェースであり、JAXBはインタフェースを処理できません

java java-ee jaxb jbossws web-services

アプリケーションをデプロイしようとしたときに、次の例外が発生したようです。

原因:com.sun.xml.bind.v2.runtime.IllegalAnnotationsException:2カウントのIllegalAnnotationException java.util.Listはインターフェースであり、JAXBはインターフェースを処理できません。 この問題は、次の場所に関連しています。at java.util.List at private java.util.List foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse._return at foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse java.util .Listは引数のないデフォルトコンストラクタを持っていません。 この問題は、次の場所に関連しています。at java.util.List at private java.util.List foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse._return at foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse
  • 戻り値の型をListからList> *に変更するまで、私のコードはうまくいきました。

これがパーシャルWebサービスです。

@Name( "relationService")@Stateless @WebService(name = "RelationService"、serviceName = "RelationService")@SOAPBinding(style = SOAPBinding.Style.DOCUMENT、use = SOAPBinding.Use.LITERAL、parameterStyle = SOAPBinding.ParameterStyle.WRAPPED )パブリッククラスRelationServiceはRelationServiceLocalを実装します。

プライベートブールログイン(文字列username、文字列パスワード){Identity.instance()。setUsername(username);} Identity.instance()。setPassword(パスワード); Identity.instance()。login(); Identity.instance()。isLoggedIn()を返します。 }

プライベートブール値logout(){Identity.instance()。logout();} return!Identity.instance()。isLoggedIn(); }

@WebMethod public List> getRelationsFromPerson(@WebParam(name = "username")文字列ユーザー名、@ WebParam(name = "パスワード")文字列パスワード、@ WebParam(名前= "foedselsnummer")文字列... foedselsnummer){

......
......
......
}
 +
* @SOAPBindingを削除してデフォルトを試しても試しましたが、同じ結果になります。 何か助けを感謝する*

更新

何かメモしたい。 すべてのListをArrayListに変更してからコンパイルしました。 私がコンパイル済みで動作していないと言うのは、それが奇妙な振る舞いをするからです。 RelationServiceStub.ArrayList型のオブジェクトを取得しましたが、そのオブジェクトにgetメソッドがないか、Listとして動作しません。 私はそれをリストにキャストしようとしましたが、それはうまくいきませんでした。

これは私がAxis 2とwsdl2javaを使った後であることに注意してください。そうそう、今それはコンパイルします、しかし私はデータを取り出す方法を知りません。

  42  12


ベストアンサー

私の理解では、JAXBはそれをXMLに変換する方法を知らないので、あなたはJAXBを介して普通の `List`を処理することはできないでしょう。

代わりに、 List`を保持するJAXB型(私はそれを Type1`と呼びます)と、それらの型のリストを保持するための別の型を定義する必要があります( Listを扱っているので)。 > `;このタイプを Type2`と呼びます。

その結果、XML出力は次のようになります。

         ...
         ...
        ...


         ...
         ...
        ...

    ...

2つの囲まれたJAXBアノテーション付きタイプがないと、JAXBプロセッサはどのマークアップを生成すればよいのかわからず、失敗します。

  • 編集:

私の言っていることは、このようになるはずです。

@XmlType
public class Type1{

    private List relations;

    @XmlElement
    public List getRelations(){
        return this.relations;
    }

    public void setRelations(List relations){
        this.relations = relations;
    }
}

and

@XmlRootElement
public class Type2{

    private List type1s;

    @XmlElement
    public List getType1s(){
        return this.type1s;
    }

    public void setType1s(List type1s){
        this.type1s= type1s;
    }
}

また、J5EEチュートリアルのhttp://java.sun.com/javaee/5/docs/tutorial/doc/bnazf.html[JAXB]セクションとhttp://jaxb.java.net/guideも確認してください。 /Mapping_interfaces.html [非公式JAXBガイド]。

25


それがあなたの目的に合っているなら、あなたはいつでもこのように配列を定義することができます:

YourType []

JAXBは確かにそれが何であるかを理解することができ、あなたはすぐにそれをクライアントサイドで使用することができるはずです。 Listからサーバーから取得した配列を変更することはできませんが、Webサービスが提供するメソッドを使用して変更することはできないため、そのようにすることもお勧めします。

8


あなたが任意のクラスのためにこれをしたいならば。

items.size()> 0を返しますか? items.toArray((Object [])Array.newInstance(items.get(0).getClass()、0)):new Object [0];

1


内側の “List”の代わりに “ArrayList”を使用できます。

-5


タイトルとURLをコピーしました