SOAP和REST Webservice在Java EE中的同一实现

4

在Java EE和JBoss 6中,是否有可能巧妙地注释Java代码以提供RESTful和SOAP Web服务而不实现两种方法?

我的想法是:

@Local
@Path("/service")
@WebService
public interface SomeService {
    @GET @Path("somemethod")
    @WebMethod
    public String someMethod (@QueryParam("s") String someParam);
}

请注意,上述示例中需要同时使用@Path@WebService注释(很遗憾,该示例无法工作)。
2个回答

3
虽然JAX-WS和JAX-RS注解可以轻松地共存于同一方法中,但我认为任何专为与JAX-RS配合使用而精心调整的接口都不可能很好地适用于JAX-WS,反之亦然。问题不在于您不能这样做,而在于您不应该这样做;它们具有不同的世界模型,对于什么是良好接口的概念也不同。
但如果您只是进行简单的查找等琐碎任务,它确实可以工作:
@GET
@Path("foo/{id}")
@Produces("application/xml")
@WebMethod(operationName = "DescribeFoo")
@WebResult(name = "Description")
public DescriptionOfFoo getFooDescription(
        @PathParam("id")
        @WebParam(name = "fooId")
        String id) {
    return get_the.description_of(id); // Whatever...
}

我喜欢尽量将所有内容放在接口上(查看您的框架文档以了解如何使它们起作用),因为这会将上面部分(!!)可能注释的数量减少到更合理的水平。(作为参考,当事情变得复杂起来并且你正在应用多个方面的非平凡模式时,每个方法很容易有超过20个注释,其中一些与您的实现有关,一些与您的一个或另一个接口有关;划分可以促进理智。)


就我个人而言,我已经成功地使用Apache CXF在同一个方法上完成了这两个操作。只是这很少是一个好的映射方式。 - Donal Fellows
谢谢!我仍在评估为JAX-WS和JAX-RS双重注释单个方法的可能性,您的答案很有帮助。我同意这不一定是一个好主意。 顺便说一下,类似于您的示例,在我的jboss实例上无法正常工作。 - kamituel

0

我希望将JAX/RS注释应用于类而不是接口。

您可能还需要进行一些配置,将JAX/RS servlet实现添加到您的Web应用程序中。

我在这里有更详细的解释,它是在WebSphere而不是JBoss中,但它使用了一个Apache开源实现,因此可能是相关的。

从概念上讲,我不明白为什么同一个简单的方法不能同时作为Web服务和RESTful服务公开,然而,这两种方法的设计哲学根本不同,当你涉及到任何非微不足道的东西时,我认为这两种方法就无法融合。


是的,一个人可以将JAXRS注释添加到类中,但我还需要EJB,并且注释接口是我找到的唯一解决方案(而且它可以完美地工作);) 现在我想为这些方法添加SOAP,当然不需要编码:) 有什么想法吗? - kamituel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接