【问题标题】:Combine REST and SOAP service in same class?将 REST 和 SOAP 服务组合在同一个类中?
【发布时间】:2014-07-24 07:44:35
【问题描述】:

我有一个正在运行的SOAP 服务,并且还想发布与REST 相同的方法。同一个班级可以使用REST吗?

@Component
@WebService
public class MyService extends SpringBeanAutowiringSupport {
    @WebMethod
    //@GET
    public String ping(@WebParam("input") String test) {
        return test;
    }
}

<jaxws:endpoint implementor="de.test.MyService" address="/MyService" />
<!-- <jaxrs:server serviceClass="de.test.MyService" address="/HRSService" /> -->

如果我将@GETjaxrs 注释掉,则会抛出以下错误:

org.apache.cxf.service.factory.ServiceConstructionException: There is an endpoint already running on /MyService.

那么,我不能在同一个服务中运行两者吗?

【问题讨论】:

  • 那是糟糕的设计。创建一个完成工作的业务服务类和两个包装器 - 一个用于 JAX-WS,一个用于 JAX-RS
  • 我当然同意业务服务类检索模型/数据是很好的做法,但是,根据请求/输入数据的方式,您可能会使用组合 JSON 来“逃脱” /SOAP-返回函数策略(请参考我的回答,如下)。

标签: java web-services rest soap


【解决方案1】:

几年前我这样做是为了让第 3 方移动应用程序开发人员可以按照他们自己的条件集成我公司的产品数据(使用 SOAP 或 REST/JSON,他们为他们的 iPhone 应用程序选择了 REST/JSON)。我创建了一个净化版本,供参考:

m2-soap-restMaven-构建的 JAX-WS/JAX-RS 示例项目)

我使用单一方法从同一模型输出两种格式。如果参考以下的接口/类实现组合:

SoapRestServiceIntf.java
SoapRestServiceImpl.java

然后,希望您能了解我为从相同的方法/对象表示返回 SOAP/XML (JAX-WS) 或 REST/JSON (JAX-RS) 所做的工作。

请参考'@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })'等注解,这取决于调用客户端请求的'Accept' header(这决定了客户端的预期响应格式)。

怀念地,回顾我的代码让我注意到了一些遗漏(这是第一次尝试),然而,巧合的是,我最近不得不使用 JAX-RS/CXF 重新访问 REST/JSON,所以我有更多实际的 JAX-RS 项目,带有输入类型规范注释、字段验证和 RESTful 测试(使用 REST-assured),可以在以下位置找到:

FeedbackCXFGradle-构建的 JAX-RS 示例项目)

这个较新的项目不会输出两种数据类型,我提到它是因为您可能会发现它对进一步参考很有用。

我个人不能保证这是否是最佳做法,它当时只是对我有用。

我希望你觉得这很有用。

顺便说一句,如果您想知道如何从 Maven 切换,Gradle 是 No-XML(不那么冗长,更易于阅读)并且基本上是标准的 Groovy 代码(即类似 Java,能够执行在构建过程中进行简单的for循环/正常编程等)。

【讨论】:

  • 这是一个很好的解决方案,包含用于 rest 和 soap 的接口和实现!
猜你喜欢
  • 2020-12-15
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 2020-02-07
相关资源
最近更新 更多