¿Crear una instancia del servicio JAX-WS sin descargar WSDL?

Tengo un servicio web que tengo enlaces de cliente generados por JAX-WS como se muestra a continuación:

// 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() {
        // ...
    }
}

Quiero poder crear una instancia de esto que apunte a un servicio remoto como:

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

Pero eso descarga el WSDL de http://www.example.com/ws?wsdl que no quiero hacer.

¿Hay alguna manera de detener la descarga de ese WSDL, pero aún apuntar al mismo punto final?

preguntado el 10 de noviembre de 11 a las 16:11

3 Respuestas

Resolví esto especificando nulo para la URL de WSDL en el cliente, así como especificando la dirección del punto final explícitamente:

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

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

respondido 12 mar '14, 19:03

He visto que esto también funciona con el constructor no-args de un servicio, en su caso WebService_Service (). No sé cuál es una mejor práctica, usar el constructor no-args o el (null, QName) como lo hace. - Marco Junio ​​Bruto

Para mí esto no fue tan simple. los @WebServiceClient la anotación tiene un wsdlLocation atributo que contiene una ruta absoluta al WSDL. Al eliminar esto manualmente (lo que realmente no desea hacer), obtuve la siguiente excepción: com.sun.xml.ws.streaming.XMLStreamReaderException: XML reader error: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character 'a' (code 97) in prolog; expected '<'. Parece que realmente espera un archivo WSDL. - Lirón

Por cierto, mi plataforma es WebLogic 12c. Además, el enlace en su respuesta está muerto. - Lirón

Gracias @Dormouse ... Actualizaré el enlace. Mi nombre de dominio tuvo que cambiar. :( - Joshua Davis

Mi solución es similar, usando un wsdl ficticio sin dirección y estableciendo una dirección válida en tiempo de ejecución: stackoverflow.com/a/25855467/2025769 - jackson casimiro

Los archivos WSDL pueden contener opciones de configuración que los stubs generados no contienen, por lo que son necesarios en tiempo de ejecución. Puede proporcionarlos localmente en su ruta de clases.

El siguiente maven pom.xml funcionó para mí después de colocar los archivos WSDL del servicio que estoy usando en mi ${basedir}\src\main\resources\META-INF\wsdl carpeta:

<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>
  [...]

En tiempo de ejecución, los archivos wsdl se cargarán desde la ruta de clases.

contestado el 12 de mayo de 14 a las 10:05

Tuve el mismo problema y lo resolví, pero no puedo revelarlo con tu muestra, porque depende del wsdl.

Aquí está mi código, rastrea la solución:

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

respondido 10 nov., 11:20

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.