没有WSDL文档文件的JAX-WS客户端

我正在使用webbevice soa,netbeans(jax-ws)我使用netbeans自动生成客户端,所有运行正常,但我看到wsdl总是在客户端运行时下载。

在生产中我不想暴露wsdl,我试图修改客户端不需要wsdl,所有我的意图都错了,我发现这个:

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

但是当第一行执行时我发现了这个例外:

 Message: El contenido no está permitido en el prólogo. at com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.wrapException(Unknown Source) at com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.next(Unknown Source) at com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.nextContent(Unknown Source) at com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil.nextElementContent(Unknown Source) at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.hasWSDLDefinitions(Unknown Source) at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(Unknown Source) at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(Unknown Source) at com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(Unknown Source) at com.sun.xml.internal.ws.client.WSServiceDelegate.(Unknown Source) at com.sun.xml.internal.ws.client.WSServiceDelegate.(Unknown Source) at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(Unknown Source) at javax.xml.ws.Service.(Unknown Source) 

有什么想忽略wsdl?

有几种方法,我将告诉你两种方式:

  1. 在本地使用WSDL文档文件

    将WSDL文档文件和schemma文件的副本保存到项目中。

     ClassLoader classloader = Thread.currentThread().getContextClassLoader(); URL wsdlLocation = classloader.getResource("MyHelloService.wsdl"); QName serviceName= new QName("http://test.com/", "MyHelloService"); MyHelloService service = new MyHelloService(wsdlLocation, serviceName); service.sayHello("Test"); 

    您可以将 WSDL文档文件与模式文件组合在一起 。

  2. 没有WSDL文档文件

    此解决方案需要客户端生成。

     QName qname = new QName("http://thenamespace", "FooService"); FooService service = new FooService(null, qname); // null for ignore WSDL Foo port = service.getFooPort(); BindingProvider bindingProvider = (BindingProvider) port; bindingProvider.getRequestContext() .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://foo.com/soap/fooBean"); // Use the service String result = port.doSomething(param); 

最后我使用CXF库,我实现了使用Paul Vargas的答案:

没有WSDL文档文件

此解决方案需要客户端生成。

 QName qname = new QName("http://thenamespace", "FooService"); FooService service = new FooService(null, qname); // null for ignore WSDL Foo port = service.getFooPort(); BindingProvider bindingProvider = (BindingProvider) port; bindingProvider.getRequestContext() .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://foo.com/soap/fooBean"); // Use the service String result = port.doSomething(param); 

使用标准钳口,此解决方案不起作用,CXF是必要的。

我也需要这样的东西。

在我的情况下,我在我的web应用程序类路径中放置了一个没有端点地址的虚拟wsdl。 之后,我在运行时设置了一个有效的地址,如下所示:

  String WSDL = "/config/ws/Main_default.wsdl"; Main service = new Main(Main.class.getResource(WSDL), new QName( "http://www.example.com/", "Main")); MainWS port = service.getMainWSPort(); BindingProvider bindingProvider = (BindingProvider) port; bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://app.example.com/ws/services/main"); Object result = port.someMethod("some param"); 

当您的xml中存在解析错误并且指定的行和列出现错误时,会发生此exception。 检查你的xml