4

アノテーションとJAXBを使用@ProducesしてJAX-RSの簡単な例を作成して実行しようとしています。@Consumes

@Stateless
@LocalBean
@Path("/hotel")
public class RestMain {

  @GET
  @Produces(MediaType.APPLICATION_XML)
  @Path("{hotelId}")
  public HotelRESTInfo read(@PathParam("hotelId") long hotelId) {
    HotelDataSourceFake hotelDataSourceFake = new HotelDataSourceFake();
    HotelRESTInfo hotelInfo = hotelDataSourceFake.getFakePlaceById(hotelId);
    return hotelInfo;
  }
}

web.xml:

<servlet>
    <servlet-name>REST App</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey Web Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

クライアントである2番目のアプリケーション。今、私は次のクライアントコードを持っています:

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
...
Client client = Client.create();
String uri ="http://localhost:8080/RESTJEE/rest/hotel/" + hotelId;
WebResource resource = client.resource(uri);
ClientResponse response = resource.accept("application/xml").get(ClientResponse.class);
HotelRESTInfo hotelRestInfo = response.getEntity(HotelRESTInfo.class);

しかし、私はジャージーのClient、ClientResponse、WebResourceを使いたくありません。でこれをやりたいです@Consumes。クライアントアプリケーションweb.xmlにいくつかの追加パラメータを含める必要がありますか?

両側(クライアントとサーバー)には、次のHotelRESTInfoクラスが含まれています。

@XmlRootElement
public class HotelRESTInfo {
...
}
4

1 に答える 1

6

私はあなたが何かをミスマッチしていると思います。

一方には要求を行うHttpClientがあり、もう一方のコンピューターには応答を作成するHttpServerがあります。それは基本的なことであり、あなたはそれを理解していると思います。

問題は、要求本文を@GET read ()method 消費し、応答本文を生成することです。

だからあなたは持つことができます:

@GET
@Consumes(MediaType.APPLICATION_XML) //client sends also xml
@Produces(MediaType.APPLICATION_XML)
@Path("{hotelId}")
public HotelRESTInfo read(@PathParam("hotelId") long hotelId) {
    (...)
}

明らかに、クライアントがWebサービスを利用することを望んでいるので@Consume クライアント側では間違いなく理にかなっています。

残念ながら、JaxRSは、Javaクライアントとの相乗効果を考慮せずに、2008年頃にサーバー側で構築されました。そして、@ Consumersは間違いなくサーバーのアノテーションであり、クライアントでのアノテーションの再利用についてはドキュメントで何も見ていません。

ジャージークライアントは、JaxRS 2仕様の取り組みで、かなり最近のものです。あなたの質問は、これらの仕様を書くのが難しいかもしれないことを示しています!

于 2012-10-20T12:11:44.457 に答える