【问题标题】:Stop jax-ws creating a local absolute path停止 jax-ws 创建本地绝对路径
【发布时间】:2014-12-18 15:42:42
【问题描述】:

我一直在寻找解决这个问题的方法

我有一个 java 项目(我继承了它)。它本质上是 SOAP Web 服务的 RESTful 包装器。我不完全确定为什么除了 PHP 连接到他们的 Web 服务时遇到问题,所以创建了一个作为客户端连接到 WS 的 Restful 服务。

问题是 jax-ws 自动生成的 Web 服务工件/类作为编译项目的机器被硬编码到本地路径。这是在项目编译时由 jax-ws 自动生成的 java 文件中创建的注释示例。

/**
 * 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 文件的路径是可以的,但是当部署到应用程序服务器时它会失败。

【问题讨论】:

标签: java web-services rest jax-ws


【解决方案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

【讨论】:

    【解决方案2】:

    您是如何引用 Web 服务客户端的?

    如果您使用@WebServiceRef 注释让容器将您的服务引用注入到您的容器托管类中。在这种情况下,您可以在自己的 Web 项目中包含 WSDL 的副本(例如,WEB-INF/wsdl/flah.wsdl),您可以使用@WebServiceRefwsdlLocation 属性来指向此位置。见javadocs for WebServiceRef annotation。那里的棘手点(在我看来)是哪些类可以使用@WebServiceRef - 必须是容器管理的(Servlet、ServletFilter、EJB、JSF 托管 bean 等)。如果您的 RESTful 代码不是容器管理的,但最终可以访问 HttpServletRequest,我偶尔使用的一个技巧是添加一个带有 @WebServiceRef 的 servlet 过滤器,以从容器中注入客户端并将其放置以供使用 -流作为请求属性。

    【讨论】:

    • 嗯不确定,据我所知,它肯定不是通过@WebServiceRef 注入任何服务引用,实际上项目中根本不存在注释。它似乎只是直接实例化从自动生成的 jax-ws 文件创建的对象。它们位于“生成源(jax-ws)下,正如 Puh 所说,这些只是为了测试?我想我应该自己重新创建服务,它实际上只有一种包装方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多