我正在使用Java学习Web服务,并想知道它是否可行。
我使用Java客户端库创建了一个RESTful服务客户端,它遵循REST的原则。
(更具体地说,我在Github上找到了这个库并且正在使用它。这个Java库与CKAN交互,CKAN是一种基于Web的开源数据系统)
然后,我想知道(我仍然想知道)这个REST客户端是否可以作为SOAP Web服务的服务器工作,如图所示。
我通过在EJB中创建Web服务类来尝试它。我将与REST客户端几乎相同的代码写入EJB的Web服务类,以便Web服务类使用GET,POST和DELETE方法。
但是,当我尝试部署此EJB(SOAP Web服务)时,Glassfish服务器会指示...
Two web services are being deployed with the same endpoint URL ckan/ckan; The service that gets loaded last will always be the one that is active for this URL.
Exception while invoking class org.glassfish.ejb.startup.EjbDeployer load method
java.lang.RuntimeException: EJB Container initialization error
可能只是因为我已经创建了一个使用相同网址的REST客户端,但我还没有找到原因。
您认为,在SOAP Web服务中,服务器端是否可以使用标准化服务器方法(即GET / POST / DELETE等)以便与外部数据存储库进行交互(在我的情况下) ,CKAN ......一个基于网络的数据管理系统)?
任何见解都将受到赞赏。
PS
将REST客户端用作SOAP的服务器的目的是测试REST和SOAP的安全性问题并进行比较。 我认为以这种方式使用REST客户端是不切实际的。
答案 0 :(得分:1)
如果我正确理解您的问题,出于学习(非实际)原因,您希望让REST Web服务调用SOAP Web服务(反之亦然)。对于一些较旧的库,由于库中的设计/代码问题,这是不可能的。但是,如果您使用的是当前版本的库,则不再适用。
使用您想要的API构建REST服务(spring库将很好地完成此操作),并将控制器方法映射到您要调用的SOAP Web服务(反之亦然)。您正在谈论使用Spring注释和一些包装代码以及Java EE漏洞的几个控制器类。
如果我向后理解问题,答案基本相同 - 只需交换SOAP和REST注释。
答案 1 :(得分:0)
是 - 它可以......
我不知道你正在使用什么REST jar - 请选择Apache CXF或Jersey 2罐子。
为所有REST服务提供单一入口点 - 使用Apache CXF,您可以获得Front Servlet体系结构。
因此,您的REST服务将部署为
http://localhost:8080/**myRESTSERVICES**
此处,Services会将其指向一个Servlet,它将把调用路由到底层REST服务。
这是Web.xml示例:
<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXF Servlet</display-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/myRESTSERVICES</url-pattern>
</servlet-mapping
此处CXF Servlet充当Front Servlet,它会将请求重定向到您的底层REST Web服务。
现在转到SOAP Web服务:
SOAP服务将在不同的端口上运行,如REST所说:9040 - 或者你想要的任何东西。
当SOAP将调用它时,将调用默认HTTP端口上的servlet,在我们的情况下是9080(9080 web sphere),但端口号是客户可以配置它