Instantiate JAX-WS service without downloading WSDL?

匿名 (未验证) 提交于 2019-12-03 02:45:02

问题:

I have a web service that I have JAX-WS generated client bindings as below:

// web service client generated by JAX-WS @WebServiceClient( ... ) public class WebService_Service extends Service {      public WebService_Service(URL wsdlLocation, QName serviceName) {         super(wsdlLocation, serviceName);     }      WebService getWebServiceSOAP() {         // ...     } } 

I want to be able to create an instance of this that points to a remote service like:

WebService_Service svc = new WebService_Service(     new URL("http://www.example.com/ws?wsdl"),     new QName("http://www.example.com/ws", "WebService")); 

But that downloads the WSDL from http://www.example.com/ws?wsdl which I don't want to do.

Is there a way to stop the downloading of that WSDL, but still point to that same endpoint?

回答1:

I resolved this by specifying null for the WSDL URL in the client, as well as specifying the endpoint address explicitly:

WebService_Service svc = new WebService_Service(   null,   new QName("http://www.example.com/ws", "WebService")); WebService port = svc.getPort(WebService.class); BindingProvider bindingProvider = (BindingProvider) port; bindingProvider.getRequestContext()   .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,     "http://www.example.com/real_endpoint_url_goes_here"); 

See: http://shrubbery.homeip.net/c/display/W/Consuming+a+Web+Service+with+Java+6+and+JAX-WS#ConsumingaWebServicewithJava6andJAX-WS-IgnoringtheWSDLCompletely



回答2:

I had the same problem and I solved this, but I can't reveal it with your sample, because it depends on the wsdl.

Here is my code, track the solution:

    //This is the input object for the webservice     GetDocumentInfoInput input = new GetDocumentInfoInput();     input.setBarcode(barcode);     //I instantiate the WS     MAKSpcIntSpcWFSpcScannerInfo_Service service  = new MAKSpcIntSpcWFSpcScannerInfo_Service();     //I get the WS port     MAKSpcIntSpcWFSpcScannerInfo         port     = service.getMAKSpcIntSpcWFSpcScannerInfo();     WSBindingProvider                    provider = (WSBindingProvider)port;     //This is the row what set the URL for the WS     provider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);     //This is the WS calling     GetDocumentInfoOutput                output   = port.getDocumentInfo(input); 


回答3:

The WSDL files might contain configuration options that the generated stubs don't contain, so they are needed at runtime. You can provide them locally in your class path.

The following maven pom.xml worked for me after placing the WSDL files of the service I'm using into my ${basedir}\src\main\resources\META-INF\wsdl folder:

<plugin>   <groupId>org.jvnet.jax-ws-commons</groupId>   <artifactId>jaxws-maven-plugin</artifactId>   <version>2.3</version>   <executions>     <execution>       <id>MyService</id>       <goals>         <goal>wsimport</goal>       </goals>       <configuration>         <!-- this resolves naming conflicts within the wsdl - there are several copies of fault report objects which clash otherwise. -->         <args>           <arg>-B-XautoNameResolution</arg>         </args>          <packageName>de.xyz</packageName>         <wsdlDirectory>${basedir}\src\main\resources\META-INF\wsdl</wsdlDirectory>         <wsdlFiles>           <wsdlFile>MyService.wsdl</wsdlFile>         </wsdlFiles>         <wsdlLocation>META-INF/wsdl/MyService.wsdl</wsdlLocation>                                  </configuration>     </execution>   [...] 

At runtime, the wsdl files will be loaded from the class path.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!