1

私は CXF 2.3.2 を使用しています。この REST サービスを作成しました。

インターフェース:

@WebMethod
@GET
@Path("/object/{id}")
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_XML})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_XML})
public Response object(@PathParam("id") Long id);

実装:

@Override
public Response object(Long id) {

    CompanyVO company = new CompanyVO();
    company.setAddress("address");
    company.setFantasyName("fantasy name");
    company.setFiscalId("fiscalid");
    company.setGroups("groups");

    return Response.ok().type(MediaType.APPLICATION_XML).entity(company).build();
}

CXF REST クライアントを使用してそのサービスを利用し、Response 内のオブジェクト Entity を InputStream ではなく Java オブジェクトとして取得する必要があります。

ResponseReader クラスを使用して Java クラスをラップし、次のように最初の実装を行いました。

String operation = "/object/{id}";

    ResponseReader reader = new ResponseReader();
    reader.setEntityClass(CompanyVO.class); 

    WebClient client = WebClient.create(PATH,  Collections.singletonList(reader));
    client.path(operation, 12L);
    client.accept(MediaType.APPLICATION_XML);
    client.type(MediaType.APPLICATION_XML);

    //the response's entity object should be this Class.
    CompanyVO company = new CompanyVO();

    Response response = client.get();

    //i get the entity object as a InputStream, but i need a CompanyVO.
    //i made this once, but i can't see the difference.
    Object entity = response.getEntity();

たぶん、私がサービスを間違えたか、クライアントの設定が悪いのでしょう。あなたの助けが必要です、お願いします!

このサービスは、Spring 3.0.5 を使用して構成されています。

<jaxrs:server id="serviceAdvisorRestServer" address="/rest">

    <jaxrs:serviceBeans>
        <ref bean="fileService"/>
    </jaxrs:serviceBeans>

     <jaxrs:extensionMappings>
        <entry key="json" value="application/json"/>
        <entry key="xml" value="application/xml"/>
        <entry key="html" value="text/html"/>
        <entry key="pdf" value="application/pdf"></entry>
    </jaxrs:extensionMappings> 

ありがとう!

4

3 に答える 3

3

クライアントで get メソッドを呼び出して Response オブジェクトを取得する代わりに、次のことを試してください。

CompanyVO company = client.get(CompanyVO.class);

これであなたの問題を解決できるかもしれないと思います。

webclient apiを見てください

また、メソッドでPathパラメーターを使用しているため、application/jsonなどのWebサービスメソッドに@Consumesアノテーションが必要になるとは思いません。

于 2012-06-02T17:06:56.363 に答える
1

CXF 2.3.X では、JAXRSClientFactory を使用してプロキシの使用に切り替えるか、get() - get(someclass.class) の二重呼び出しを使用する以外に、明確な解決策はありません。Web クライアントはリーダー プロバイダをサポートしていません。

CXF 2.7.X は JAX-RS 2.0 を (ほぼ) 実装しており、このバージョンから client.readEntity() を呼び出すことができます。

于 2013-11-13T13:11:24.730 に答える
0

プロキシ APIの場合、次のように動作するはずです。

試す:

ResponseReader reader = new ResponseReader();
reader.setEntityClass(CompanyVO.class); 

InterfaceClass proxy = JAXRSClientFactory.create(PATH, InterfaceClass.class, Collections.singletonList(reader));

それで:

Response res = proxy.get();
CompanyVO company = (CompanyVO) res.getEntity();

WebClientの場合、まったく同じように動作するはずです。

試す:

ResponseReader reader = new ResponseReader();
reader.setEntityClass(CompanyVO.class); 

WebClient client = WebClient.create(PATH, Collections.singletonList(reader));

それで:

Response res = client.get();
CompanyVO company = (CompanyVO) res.getEntity();
于 2012-07-17T10:17:38.313 に答える