使用@Consumes,@ Produces和JAXB的简单JAX-RS示例

时间:2012-10-20 11:22:25

标签: java web-services rest java-ee jax-rs

我正在尝试使用@Produces@Consumes注释和JAXB创建和运行JAX-RS的简单示例。

@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>

第二个应用程序是客户端。 现在我有以下客户端代码:

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);

但我不想使用jersey的Client,ClientResponse和WebResource。 我想用@Consumes执行此操作。 客户端应用web.xml是否应包含一些其他参数?

双方(客户端和服务器)都包含HotelRESTInfo类:

@XmlRootElement
public class HotelRESTInfo {
...
}

1 个答案:

答案 0 :(得分: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) {
    (...)
}

显然,您希望客户端使用网络服务,因此@Consume 在客户端明确有意义

不幸的是,JaxRS是在2008年左右在服务器端构建的,没有考虑与Java客户端的协同作用。 @Consumes绝对是一个服务器注释,我没有在客户端的documentation anything about reusing注释中看到。

泽西岛客户端是最近的,是JaxRS 2规范的努力。您的问题表明这些规范可能难以编写!