Java 针对单个应用程序的REST和SOAP Web服务

Java 针对单个应用程序的REST和SOAP Web服务,java,rest,tomcat,soap,gradle,Java,Rest,Tomcat,Soap,Gradle,我们已经使用Spring构建了一个应用程序,并使用Tomcat部署了它。我们有一个working-REST接口,但是我们的一个客户机只有一个SOAP客户机 我的理解是SOAP web服务和REST web服务不能在同一端口或应用程序上共存 在接受SOAP请求时,我有哪些选项可以尽可能少地进行开发。我应该通过rest接口接受soap数据包并解析XML吗?或者我可以设置一个SOAP接口与我的REST接口通信并做出响应吗 我使用Gradle作为我的构建工具。将解决方案作为单个WAR文件的一部分会很好根

我们已经使用Spring构建了一个应用程序,并使用Tomcat部署了它。我们有一个working-REST接口,但是我们的一个客户机只有一个SOAP客户机

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

在接受SOAP请求时,我有哪些选项可以尽可能少地进行开发。我应该通过rest接口接受soap数据包并解析XML吗?或者我可以设置一个SOAP接口与我的REST接口通信并做出响应吗

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

根据我的经验,如果您非常小心JAXB的XML名称空间,那么可以在同一个应用程序中混合使用SOAP和REST。但是,我不建议这样做,因为更新一个意味着冒着另一个稳定性的风险。以下是我的建议

  • 创建三个项目,一个用于业务逻辑,一个用于REST接口,一个用于SOAP接口
  • 修改REST/SOAP接口以使用公共业务逻辑项目
  • 作为两场独立的战争部署
  • 我应该通过rest接口接受soap数据包并解析XML吗

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

    或者我可以设置一个SOAP接口与我的REST接口通信并做出响应吗


    您可能会以牺牲性能和/或可维护性为代价。

    听起来您的web服务主要是REST(现在是2013年),但您必须在有限的情况下支持soap。我将主要考虑rest来设计web服务,但可能会使用单独的机制向服务器指示客户端需要soap支持。如果可能的话,让soap客户机发送http请求头或使用可能以.soap结尾的修改过的URL。无论如何,没有理由不能在同一个应用程序上支持这两个协议。

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

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

    您需要做的是为这两个应用程序创建不同的URI。e、 g
    someService/**
    用于SOAP,而
    somerest
    用于rest实现。您可以有一个服务层来处理共享逻辑(主要是端点和rest控制器上需要的代码,用于从服务层获取所需的数据并将其发送以进行封送)

    只需在
    web.xml
    文件中添加一些条目,以指示rest路径和端点路径

    您可以按照以下步骤进行操作:

    1类实现

    @javax.jws.WebService(endpointInterface = "com.test.ebpp.autopayment.tess.ejb.GService", targetNamespace = "http://ejb.test.autopayment.ebpp.tess.com/", serviceName = "ApplicationBusinessFacadeService", portName = "ApplicationBusinessFacadePort")
    @Path(value = "/ApplicationBusinessFacadeService")
    public class ApplicationBusinessFacadePortBindingImpl implements
        ApplicationBusinessFacade {
        @Override
        @POST
        @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
        @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
        public ProcessResponse process(Process request) {
            //type your code 
        }
    }
    
    2-服务接口

    @WebService(name = "ApplicationBusinessFacade", targetNamespace =   "http://ejb.gateway.ebpp.com/")
    @XmlSeeAlso({
    com.ebpp.gateway.ejb.ObjectFactory.class,
    com.ebpp.ifxmessages.ObjectFactory.class
    })
    public interface ApplicationBusinessFacade {
    
    @WebMethod
    @WebResult(targetNamespace = "")
    @RequestWrapper(localName = "process", targetNamespace = "http://ejb.gateway.ebpp.com/", className = "com.ebpp.gateway.ejb.Process")
    @ResponseWrapper(localName = "processResponse", targetNamespace = "http://ejb.gateway.ebpp.com/", className = "com.ebpp.gateway.ejb.ProcessResponse")
    public ProcessResponse process(
        @WebParam(name = "arg0", targetNamespace = "")
        Process arg0);
     }
    
    3-web.xml

     <servlet>        
            <servlet-name>com.ebpp.core.rs.config.ApplicationConfiguration</servlet-name>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>com.ebpp.core.rs.config.ApplicationConfiguration</servlet-name>
            <url-pattern>/rest/*</url-pattern>
        </servlet-mapping>
     </servlet>
    
    
    com.ebpp.core.rs.config.ApplicationConfiguration
    1.
    com.ebpp.core.rs.config.ApplicationConfiguration
    /休息/*
    
    为该客户开发REST客户端会更简单吗?实际上这是一个很好的观点,但我认为他们的应用程序处于“濒临死亡-尽可能少地接触它”模式谢谢。我要试一试。所以一个WAR有REST plus业务逻辑,另一个有SOAP接口?嗯,两个WAR文件都将使用第三个jar提供业务逻辑。(对不起,我不能不回答这个问题:-)我同意这种方法。我发现基于REST的Java Jersey项目和JAXB支持可以帮助解决这个问题:这段代码为我运行,您可以通过ahmed向我发送更多信息。albhy2001@gmail.com对于web.xml,尝试将url模式更改为/rest/*
     <servlet>        
            <servlet-name>com.ebpp.core.rs.config.ApplicationConfiguration</servlet-name>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>com.ebpp.core.rs.config.ApplicationConfiguration</servlet-name>
            <url-pattern>/rest/*</url-pattern>
        </servlet-mapping>
     </servlet>