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

mls*_*dev 9 java client netbeans web-services 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");
Run Code Online (Sandbox Code Playgroud)

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

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.<init>(Unknown Source)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(Unknown Source)
    at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(Unknown Source)
    at javax.xml.ws.Service.<init>(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

有什么想忽略wsdl?

Pau*_*gas 18

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

  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");
    
    Run Code Online (Sandbox Code Playgroud)

    您可以 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);
    
    Run Code Online (Sandbox Code Playgroud)


mls*_*dev 6

最后我使用 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);
Run Code Online (Sandbox Code Playgroud)

使用标准的jaw-ws,这个解决方案不起作用,CXF是必要的。