直接从源创建Web服务客户端

我试图直接从@Webservice类生成WS客户端jar。

我们来看这个例子:

package com.example.maven.jaxws.helloservice; import javax.jws.WebService; @WebService public class Hello { public String sayHello(String param) { ; return "Hello " + param; } } 

我可以生成一个war文件并使用glassfish来提供这个webservice,从那里我可以使用glassfish WSDL URL来生成客户端源。

我想要做的是跳过glassfish部分。 从定义webservice的maven项目开始,我想使用jaxws-maven-plugin来创建客户端类,但我找不到任何方法来指定webservice的实际URL。

它可能是对的吗?

@see还使用已知但无法访问的wsdl创建Web服务客户端

您应该使用选项来指定部署后WSDL文件可用的服务位置。

使用-wsdlLocation开关

还有另一种简单的方法 – 只需使用-wsdlLocation开关运行wsimport并提供相对于生成的Service类的WSDL位置值,您需要将此WSDL文件放在此相对位置。

有关详细信息,请参阅post 。

创建Web服务客户端应用程序总是从现有的WSDL文件开始(与开发Web服务提供者不同),即使这不是唯一的方法,我建议使用wsimport工具(请参阅5创建Java Web服务的技术)从WSDL获取其他选项,但我不会介绍它们)。

因此,在您的客户端项目中,将以下代码段添加到您的pom.xml

    org.codehaus.mojo jaxws-maven-plugin    wsimport     http://localhost:8080/helloservice/HelloService?wsdl   com.example.maven.jaxws.helloclient       

jaxws-maven-plugin:wsimport mojo默认绑定到generate-sources生命周期阶段,因此运行generate-sources后面的任何阶段都会触发jaxws:wsimport目标。

请注意,这实际上是一个最小配置。 如果您需要更多详细信息/控制,请查看wsimport mojo的文档。

例如,要使用文件而不是WSDL的URL(并在更符合maven最佳实践的位置生成Java代码),请使用:

  ${project.build.directory}/generated-sources/wsimport ${basedir}/src/wsdl  foo.wsdl bar.wsdl  ...  

更新:要调用预配置的存根(使用WSDL中的端点地址),代码为:

 Hello port = new HelloService().getHelloPort(); String result = port.sayHello("Duke!"); 

要调用其地址与WSDL中指定的端点不同的端点,请定义新的端点URL和QName:

 URL endpoint_new = new URL( "NEW_ADDRESS_HERE" ); QName qname = new QName( "http://"+"ORIGINAL_PACKAGE", "SERVICENAME" ); Hello port = new HelloService( endpoint_new, qname ).getHelloPort(); 

其中ORIGINAL_PACKAGE是发布服务的包, SERVICENAME是我们需要的服务的名称,例如HelloService