RESTful 网络服务端点上的 JAX-WS @WebService
JAX-WS @WebService on RESTful web-service endpoint
前段时间在其中一个项目中,我在一些 jersey root(@Path) 资源上发现了 @WebService 注释 类。据我当时的理解,这是一些遗留代码或只是误用的 JAX-WS 注释。最近我偶然发现了这个post,其中为了提到 EJB 而将 JAX-RS 服务与 @WebService 注释混合(作为旁注,我从事的那个项目根本没有使用 EJB,所以我仍然认为这是对@WebService 的不当使用)。由于所有这些,我现在很困惑混合 @WebService 和 JAX-RS 是否通常是合理的。那有什么情况呢?除了提到的 EJB 功能之外,还有什么?
使用 @WebService
将 JAX-RS bean 公开为 SOAP WS 的方法在技术上是可行的。它不会带来好的 API 设计。
考虑一些非常常见的 JAX-RS 方法:
@GET
@Path("/foos")
@Produces("application/json")
public Response getFoos() {
// get all Foos
List<Foo> foos = ...;
return Response.ok(foos).build();
}
@GET
@Path("/foos/{id}")
@Produces("application/json")
public Response getSingleFoo(@PathParam("id") String id) {
// get the Foo
Foo foo = ...;
return Response.ok(foo).build();
}
调用这些方法的 URL 的结构和结果将是显而易见的。
但是使用 @WebService
公开这些方法会导致许多问题:
- 什么是 SOAP 响应中的
Response
?
- 响应会用JSON表示吗?
- 如何调用方法?
我可以想象没有一个用例不是完全微不足道的,对于它来说,使用 JAX-RS 和 JAX-WS 公开相同的方法是有意义的。它可以是一种对一个人有用的方法,但对两者都不是。
不要这样做。
前段时间在其中一个项目中,我在一些 jersey root(@Path) 资源上发现了 @WebService 注释 类。据我当时的理解,这是一些遗留代码或只是误用的 JAX-WS 注释。最近我偶然发现了这个post,其中为了提到 EJB 而将 JAX-RS 服务与 @WebService 注释混合(作为旁注,我从事的那个项目根本没有使用 EJB,所以我仍然认为这是对@WebService 的不当使用)。由于所有这些,我现在很困惑混合 @WebService 和 JAX-RS 是否通常是合理的。那有什么情况呢?除了提到的 EJB 功能之外,还有什么?
使用 @WebService
将 JAX-RS bean 公开为 SOAP WS 的方法在技术上是可行的。它不会带来好的 API 设计。
考虑一些非常常见的 JAX-RS 方法:
@GET
@Path("/foos")
@Produces("application/json")
public Response getFoos() {
// get all Foos
List<Foo> foos = ...;
return Response.ok(foos).build();
}
@GET
@Path("/foos/{id}")
@Produces("application/json")
public Response getSingleFoo(@PathParam("id") String id) {
// get the Foo
Foo foo = ...;
return Response.ok(foo).build();
}
调用这些方法的 URL 的结构和结果将是显而易见的。
但是使用 @WebService
公开这些方法会导致许多问题:
- 什么是 SOAP 响应中的
Response
? - 响应会用JSON表示吗?
- 如何调用方法?
我可以想象没有一个用例不是完全微不足道的,对于它来说,使用 JAX-RS 和 JAX-WS 公开相同的方法是有意义的。它可以是一种对一个人有用的方法,但对两者都不是。
不要这样做。