3

私はJersey 1.1を使用しています(古い、私は知っています-Java 1.5で立ち往生しているため、そうしなければなりません)。Java オブジェクトがエンティティとして返される単純な GET を実行しています。Web 経由で GET 要求を行うことができ、うまく機能するため、Java オブジェクトは正しく (Java から XML に) マーシャリングされています。Jersey クライアントを使用して GET リクエストを作成し、それをアンマーシャリングして Java オブジェクトに戻そうとしていますが、ここで失敗しています。正しく注釈が付けられているため、Jersey は GET 要求から受け取った XML をアンマーシャリングして POJO に戻す方法を知っているべきではありませんか? サーバー側で動作します。これが私が得る例外です:

ClientHandlerException: A message body reader for Java type, class my.class.SearchResult, and MIME media type, application/xml was not found.

クライアントコードは次のとおりです。

private SearchResult search() {
    WebResource wr = new Client().resource( "http://localhost:8080/MyProject/search" );
    return wr.get( SearchResult.class );
}

クライアントとサーバーで使用している JAXB アノテーション付き POJO は次のとおりです。

@XmlRootElement(name = "searchResults")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "searchResults", propOrder = {
    "results"
})
public class SearchResult {
    @XmlElement(name = "result")
    private List<Result> results = new ArrayList<Result>();

    public List<Result> getResults() {
        return results;
    }
    ...
}

内部の Result POJO も次のとおりです。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "resultType", propOrder = {
    "name",
    "version",
    "type"
})
public class Result {
    private String name;
    private String version;
    private String type;
    ...
}

GET サービス自体は次のとおりです。

@Path("/search")
public class SearchRest {
    @GET
    @Produces(MediaType.APPLICATION_XML)
    public SearchResult search() {
        SearchResult result = new SearchResult();
        ....
        return result;
    }
}

ありがとうございました!

4

2 に答える 2

3

@XmlRootElementクラスに注釈を追加しますResult

于 2012-05-17T14:54:03.630 に答える
3

クライアント側のクラスパスに JAXB jar を追加することで、この問題を修正しました。これで問題が解決した理由はわかりませんが、jar が存在しなかったため、POJO 内の @XmlRootElement およびその他の JAXB アノテーションが実行時に単純に無視されたためだと思います。これにより、Jersey はアノテーションを検出せず、クライアント側で xml と POJO の間で変換する方法がないと考えました。ルート POJO を JAXBElement でラップするという、注釈の必要を回避する別の方法を試したときに、解決策を発見しました。JAXBElement を生成するように Web サービス クラスを更新し、同じことを期待するようにクライアントを更新しました。次に、JAXBElement を直接参照していたため、欠落している jar を示す NoClassDefFoundError を取得しました。運が良かったと思います。

于 2012-05-17T17:29:59.800 に答える