我对这个问题的解决方案看起来很高和很低
我有一个java项目(我继承了)。它本质上是SOAP Web服务的RESTful包装器。我不完全确定为什么除了PHP连接到他们的Web服务有问题之外,所以创建了一个Restful服务,它连接到WS作为客户端。
问题是jax-ws自动生成的Web服务工件/类被硬编码到本地路径,作为编译项目的机器。以下是在java文件中创建的注释示例,该文件由jax-ws在项目编译时自动生成。
/**
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.2.10-b140803.1500
* Generated source version: 2.2
*
*/
@WebServiceClient(
name = "flahImplService",
targetNamespace = "http://flah.com/",
wsdlLocation = "file:/C:/Users/WindowsUser/PathToNetBeansProjectFolder/flah.wsdl")
public class flahImplService
}
它似乎链接到在线WSDL并基于此构建文件。
我能找到的另一个重要的事情是,在/nbproject/jax-ws.xml中有一个像这样的xml:
<?xml version="1.0" encoding="UTF-8"?>
<jax-ws xmlns="http://www.netbeans.org/ns/jax-ws/1">
<services>
<service name="flahImplService">
<implementation-class>com.service.management.flahImplService</implementation-class>
<wsdl-url>https://blah.com/flah.wsdl</wsdl-url>
<wsdl-url>blah.com/flah.wsdl</wsdl-url>
我应该在哪里指定替换此自动生成和硬编码本地WSDL位置的路径?
编辑:顺便说一下,当我在本地运行这个项目时,它当然有效,因为wsdl文件的路径没问题,但是当部署到应用服务器时它失败了。
答案 0 :(得分:1)
实际上你不应该使用生成的客户端...它只是用于测试。使用这样的东西来创建你的客户:
import java.net.URL;
import javax.xml.ws.Service;
...
URL wsdlURL = new URL("http://localhost/hello?wsdl");
QName SERVICE_NAME = new QName("http://apache.org/hello_world_soap_http", "SOAPService");
Service service = Service.create(wsdlURL, SERVICE_NAME);
Greeter client = service.getPort(Greeter.class);
String result = client.greetMe("test");
答案 1 :(得分:0)
您是如何引用Web服务客户端的?
如果您正在使用@WebServiceRef
注释让容器将您的服务引用注入您的容器托管类。在这种情况下,您可以在自己的Web项目中包含WSDL的副本(例如,WEB-INF/wsdl/flah.wsdl
),您可以使用wsdlLocation
的{{1}}属性来指向此位置。见javadocs for WebServiceRef
annotation。从那里(在我看来)中,棘手的一点是类可以使用@WebServiceRef
- 必须是容器管理的(Servlet,ServletFilter,EJB,JSF托管bean等)。如果您的RESTful代码不是容器管理但最终可以访问@WebServiceRef
,我偶尔使用的一个技巧是添加一个带有HttpServletRequest
的servlet过滤器,以便从客户端注入容器并将其作为请求属性放在下游使用。