Cuando genero un cliente de servicio web usando wsdl2java de CXF (que genera algo similar a wsimport), a través de Maven, mis servicios comienzan con códigos como este:
@WebServiceClient(name = "StatusManagement",
wsdlLocation = "c:/some_absolute_path_to_a_wsdl_file.wsdl",
targetNamespace = "http://tempuri.org/")
public class StatusManagement extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement");
public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus");
static {
URL url = null;
try {
url = new URL("c:/some_absolute_path_to_a_wsdl_file.wsdl");
} catch (MalformedURLException e) {
System.err.println("Can not initialize the default wsdl from c:/some_absolute_path_to_a_wsdl_file.wsdl");
// e.printStackTrace();
}
WSDL_LOCATION = url;
}
El camino absoluto codificado realmente apesta. La clase generada no funcionará en ninguna otra computadora que no sea la mía.
La primera idea es colocar el archivo WSDL (más todo lo que importa, otros WSDL y XSD) en algún lugar en un archivo jar y classpath. Pero queremos evitar esto. Como todo eso fue generado por CXF y JAXB basado en WSDL y XSD, no vemos ningún punto en la necesidad de conocer el WSDL en tiempo de ejecución.
El atributo wsdlLocation está destinado a anular la ubicación WSDL (al menos esto es lo que leí en alguna parte), y su valor predeterminado es "". Como estamos usando maven, intentamos incluir <wsdlLocation></wsdlLocation>
dentro de la configuración de CXF para tratar de forzar al generador de origen a dejar wsdlLocation en blanco. Sin embargo, esto simplemente hace que ignore la etiqueta XML porque está vacía. Hicimos un truco vergonzoso realmente feo, usando <wsdlLocation>" + "</wsdlLocation>
.
Esto también cambia otros lugares:
@WebServiceClient(name = "StatusManagement",
wsdlLocation = "" + "",
targetNamespace = "http://tempuri.org/")
public class StatusManagement extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement");
public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus");
static {
URL url = null;
try {
url = new URL("" + "");
} catch (MalformedURLException e) {
System.err.println("Can not initialize the default wsdl from " + "");
// e.printStackTrace();
}
WSDL_LOCATION = url;
}
Entonces, mis preguntas son:
¿Realmente necesitamos una ubicación WSDL incluso si todas las clases fueron generadas por CXF y JAXB? ¿Si es así por qué?
Si realmente no necesitamos la ubicación WSDL, ¿cuál es la forma correcta y limpia de hacer que CXF no lo genere y lo evite por completo?
¿Qué efectos secundarios negativos podríamos tener con ese truco? Todavía no podemos probar eso para ver qué sucede, por lo que si alguien pudiera decir con anticipación, sería bueno.
classpath:
en la<wsdlLocation...
línea.