¿Crear una instancia del servicio JAX-WS sin descargar WSDL?
Frecuentes
Visto 18,728 equipos
16
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?
3 Respuestas
20
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");
respondido 12 mar '14, 19:03
2
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
1
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 java web-services wsdl jax-ws or haz tu propia pregunta.
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 unwsdlLocation
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ónPor 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