Quando generi un client di servizi web usando wsdl2java da CXF (che genera qualcosa di simile a wsimport), tramite Maven, i miei servizi iniziano con codici come questo:
@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;
}
Il percorso assoluto hardcoded fa davvero schifo. La classe generata non funzionerà in nessun altro computer diverso dal mio.
La prima idea è quella di mettere il file WSDL (più tutto ciò che importa, altri WSDL e XSD) da qualche parte in un file jar e classificarlo. Ma vogliamo evitare questo. Dal momento che tutto ciò è stato generato da CXF e JAXB basati su WSDL e XSD, non vediamo il bisogno di conoscere il WSDL in fase di esecuzione.
L'attributo wsdlLocation ha lo scopo di sovrascrivere la posizione WSDL (almeno questo è quello che ho letto da qualche parte) e il suo valore predefinito è "". Dato che stiamo usando Maven, abbiamo cercato di includere <wsdlLocation></wsdlLocation>
all'interno della configurazione di CXF per provare a forzare il generatore di sorgenti a lasciare vuoto wsdlLocation. Tuttavia, ciò fa semplicemente ignorare il tag XML perché è vuoto. Abbiamo fatto un brutto colpo vergognoso, usando <wsdlLocation>" + "</wsdlLocation>
.
Questo cambia anche altri luoghi:
@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;
}
Quindi, le mie domande sono:
Abbiamo davvero bisogno di una posizione WSDL anche se tutte le classi sono state generate da CXF e JAXB? Se si, perché?
Se non abbiamo davvero bisogno del percorso WSDL, qual è il modo corretto e pulito per fare in modo che CXF non lo generi ed evitarlo del tutto?
Quali effetti collaterali negativi potremmo avere con quell'hack Non possiamo ancora testarlo per vedere cosa succede, quindi se qualcuno potesse dire in anticipo, sarebbe bello.
classpath:
nella<wsdlLocation...
riga.