停止jax-ws创建本地绝对路径

时间:2014-10-23 02:06:38

标签: java web-services rest jax-ws

我对这个问题的解决方案看起来很高和很低

我有一个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文件的路径没问题,但是当部署到应用服务器时它失败了。

2 个答案:

答案 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");

另请参阅Spring cxf client configuration

答案 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过滤器,以便从客户端注入容器并将其作为请求属性放在下游使用。