Java 针对单个应用程序的REST和SOAP Web服务
我们已经使用Spring构建了一个应用程序,并使用Tomcat部署了它。我们有一个working-REST接口,但是我们的一个客户机只有一个SOAP客户机 我的理解是SOAP web服务和REST web服务不能在同一端口或应用程序上共存 在接受SOAP请求时,我有哪些选项可以尽可能少地进行开发。我应该通过rest接口接受soap数据包并解析XML吗?或者我可以设置一个SOAP接口与我的REST接口通信并做出响应吗 我使用Gradle作为我的构建工具。将解决方案作为单个WAR文件的一部分会很好根据我的经验,如果您非常小心JAXB的XML名称空间,那么可以在同一个应用程序中混合使用SOAP和REST。但是,我不建议这样做,因为更新一个意味着冒着另一个稳定性的风险。以下是我的建议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文件的一部分会很好根
您可能会以牺牲性能和/或可维护性为代价。听起来您的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>