50

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

Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of     IllegalAnnotationExceptions
java.util.List is an interface, and JAXB can't handle interfaces.
this problem is related to the following location:
    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 does not have a no-arg default constructor.
    this problem is related to the following location:
        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<List<RelationCanonical>> に変更するまで、私のコードはうまく機能しました

部分的な Web サービスは次のとおりです。


@Name("relationService")
@Stateless
@WebService(name = "RelationService", serviceName = "RelationService")
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
public class RelationService implements RelationServiceLocal {

    private boolean login(String username, String password) {
        Identity.instance().setUsername(username);
        Identity.instance().setPassword(password);
        Identity.instance().login();
        return Identity.instance().isLoggedIn();
    }

    private boolean logout() {
        Identity.instance().logout();
        return !Identity.instance().isLoggedIn();
    }

    @WebMethod
    public List<List<RelationCanonical>> getRelationsFromPerson(@WebParam(name = "username")
    String username, @WebParam(name = "password")
    String password, @WebParam(name = "foedselsnummer")
    String... foedselsnummer) {

......
......
......
}


@SOAPBinding を削除してデフォルトを試してみましたが、同じ結果が発生します。どんな助けにも感謝します

アップデート

特筆したいことがあります。すべての List を ArrayList に変更してから、コンパイルしました。コンパイル済みで動作しないと言う理由は、動作がおかしいからです。タイプ RelationServiceStub.ArrayList のオブジェクトを取得しますが、オブジェクトに取得メソッドがないか、リストとして動作しません。また、リストにキャストしようとしましたが、うまくいきませんでした。

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

4

4 に答える 4

28

List私の理解では、JAXBはそれをXMLに変換する方法を知らないため、JAXBを介してプレーンを処理することはできません。

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

結果は、次のようなXML出力になる可能性があります。

<Type2 ...>
    <Type1 ...>
        <RelationCanonical ...> ... </RelationCanonical>
        <RelationCanonical ...> ... </RelationCanonical>
        ...
    </Type1>
    <Type1>
        <RelationCanonical ...> ... </RelationCanonical>
        <RelationCanonical ...> ... </RelationCanonical>
        ...
    </Type1>
    ...
</Type2>

2つの囲まれたJAXB注釈付きタイプがないと、JAXBプロセッサは生成するマークアップを認識できないため、失敗します。

- 編集:

私が意味することは、このようにいくらか見えるはずです:

@XmlType
public class Type1{

    private List<RelationCanonical> relations;

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

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

@XmlRootElement
public class Type2{

    private List<Type1> type1s;

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

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

また、J5EEチュートリアルのJAXBセクション非公式JAXBガイドも確認する必要があります。

于 2008-11-18T14:39:50.123 に答える
8

それが目的に合っている場合は、いつでも次のように配列を定義できます。

YourType[]

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

于 2009-07-13T12:48:31.783 に答える
1

どのクラスでもこれを実行したい場合。

return items.size() > 0 ? items.toArray((Object[]) Array.newInstance(
            items.get(0).getClass(), 0)) : new Object[0];
于 2011-10-31T23:35:23.517 に答える