Kiedy generuję klienta webservice za pomocą wsdl2java z CXF (który generuje coś podobnego do wsimport), za pośrednictwem maven, moje usługi zaczynają się od takich kodów:
@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;
}
Zakodowana na stałe ścieżka absolutna naprawdę jest do niczego. Wygenerowana klasa nie będzie działać na żadnym innym komputerze niż mój.
Pierwszym pomysłem jest umieszczenie pliku WSDL (plus wszystko, co importuje, inne WSDL i XSD) gdzieś w pliku jar i to w ścieżce klas. Ale chcemy tego uniknąć. Ponieważ wszystko to zostało wygenerowane przez CXF i JAXB oparte na plikach WSDL i XSD, nie widzimy potrzeby znajomości WSDL w czasie wykonywania.
Atrybut wsdlLocation ma na celu przesłonięcie położenia WSDL (przynajmniej to gdzieś przeczytałem) i jego domyślną wartością jest „”. Ponieważ używamy maven, próbowaliśmy dołączyć <wsdlLocation></wsdlLocation>
do konfiguracji CXF, aby spróbować zmusić generator źródłowy do pozostawienia pustego miejsca wsdlLocation. Jednak to po prostu powoduje, że ignoruje znacznik XML, ponieważ jest pusty. Zrobiliśmy naprawdę brzydki, haniebny hack, używając <wsdlLocation>" + "</wsdlLocation>
.
To zmienia również inne miejsca:
@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;
}
Więc moje pytania to:
Czy naprawdę potrzebujemy lokalizacji WSDL, nawet jeśli wszystkie klasy zostały wygenerowane przez CXF i JAXB? Jeśli tak, dlaczego?
Jeśli naprawdę nie potrzebujemy lokalizacji WSDL, jaki jest właściwy i czysty sposób, aby CXF jej nie generował i całkowicie jej unikał?
Jakie złe skutki uboczne moglibyśmy uzyskać dzięki temu włamaniu? Nadal nie możemy tego przetestować, aby zobaczyć, co się stanie, więc gdyby ktoś mógł powiedzieć z góry, byłoby miło.
classpath:
w<wsdlLocation...
wierszu.