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 公开相同的方法是有意义的。它可以是一种对一个人有用的方法,但对两者都不是。

不要这样做。