用于单个应用程序的REST和SOAP Web服务

问题描述 投票:15回答:4

我们使用Spring构建一个应用程序并使用Tomcat进行部署。我们有一个工作的REST接口,但是我们的一个客户端只有一个SOAP客户端。

我的理解是SOAP Web服务和REST Web服务不能在同一个端口或应用程序上共存。

我可以选择尽可能少地接受SOAP请求。我应该通过rest接口接受soap数据包并解析XML吗?或者我可以设置SOAP接口与我的REST接口通信并回复?

我正在使用Gradle作为我的构建工具。将解决方案作为单个WAR文件的一部分会很好

java rest tomcat soap gradle
4个回答
11
投票

根据我的经验,如果您对JAXB的XML命名空间非常小心,可以在同一个应用程序中混合使用SOAP和REST。但是,我不推荐它,因为更新一个意味着冒着对方的稳定性。这是我推荐的......

  1. Setup a multi-project build in gradle
  2. 创建三个项目,一个用于业务逻辑,一个用于REST接口,另一个用于SOAP接口
  3. 修改REST / SOAP接口以使用公共业务逻辑项目
  4. 部署为两个单独的WAR

我应该通过rest接口接受soap数据包并解析XML吗?

SOAP是一种协议而不仅仅是一种格式,因此这可能不适用于大多数(任何?)框架。

或者我可以设置SOAP接口与我的REST接口通信并回复?

您可能会牺牲性能和/或可维护性。


3
投票

我们有一个具有类似要求的项目。我们仍然需要支持SOAP,我们将继续使用ReST。

没有理由说这两者会发生冲突。由于您使用的是spring,因此您甚至可以将相同的域对象作为响应,将其作为您的首选项编组为XML和JSON。

你要做的是为两者创建不同的URI。例如someService/**用于SOAP和some-rest用于ReST实现。您可以拥有一个服务层来处理共享逻辑(主要是端点上需要的代码,其余控制器是从服务层获取所需数据并将其发送到编组)

只需在web.xml文件中添加一些条目即可指示其余路径和端点路径......


0
投票

听起来你的网络服务主要是REST(它是2013年),但你必须支持有限的情况下的肥皂。我主要考虑休息时设计您的Web服务,但也许使用单独的机制向服务器指示客户端需要soap支持。如果可能,请让soap客户端发送http请求标头或使用可能以.soap结尾的修改后的URL。在任何情况下,没有理由不能在同一个应用程序上支持这两种协议。


-2
投票

你可以通过在类实现上注释rest和soap,以及创建用于保存汤的方法注释的接口来实现。并在类实现中将rest注释放在方法上并配置web.xml文件以添加servlet以用于您使用的其余实现。 _为您使用的Rest实现添加配置[ApplicationConfiguration is class only extend Application]

 <servlet>        
        <servlet-name>com.fawryis.ebpp.core.rs.config.ApplicationConfiguration</servlet-name>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>com.fawryis.ebpp.core.rs.config.ApplicationConfiguration</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

@javax.jws.WebService(endpointInterface = "com.test.ebpp.autopayment.tess.ejb.GService", targetNamespace = "http://ejb.test.autopayment.ebpp.tess.com/", serviceName = "testPaymentService", portName = "testPaymentPort")
@Path(value = "/testPaymentService")
public class testPaymentPortBindingImpl implements
        testPaymentService {
@Override
    @POST
    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    public Typeobj process(Typeobj request) {
//type your code 
}
© www.soinside.com 2019 - 2024. All rights reserved.