Quando eu gero um cliente de serviço da web usando wsdl2java do CXF (que gera algo semelhante ao wsimport), via maven, meus serviços começam com 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;
}
O caminho absoluto codificado realmente é péssimo. A classe gerada não funcionará em nenhum outro computador além do meu.
A primeira idéia é colocar o arquivo WSDL (mais tudo o que ele importa, outros WSDLs e XSDs) em algum lugar do arquivo jar e classpath. Mas queremos evitar isso. Como tudo isso foi gerado pelo CXF e JAXB com base nos WSDLs e XSDs, não vemos sentido em precisar conhecer o WSDL em tempo de execução.
O atributo wsdlLocation destina-se a substituir o local WSDL (pelo menos é o que eu li em algum lugar) e seu valor padrão é "". Como estamos usando o maven, tentamos incluir <wsdlLocation></wsdlLocation>
dentro da configuração do CXF para tentar forçar o gerador de origem a deixar o wsdlLocation em branco. No entanto, isso simplesmente ignora a tag XML porque está vazia. Nós fizemos um truque vergonhoso, realmente feio, usando <wsdlLocation>" + "</wsdlLocation>
.
Isso muda outros lugares também:
@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;
}
Então, minhas perguntas são:
Realmente precisamos de um local WSDL, mesmo que todas as classes tenham sido geradas por CXF e JAXB? Se sim, por que?
Se realmente não precisamos da localização do WSDL, qual é a maneira correta e limpa de fazer com que o CXF não a gere e evite totalmente?
Que efeitos colaterais ruins podemos obter com esse hack? Ainda não podemos testar isso para ver o que acontece, por isso, se alguém pudesse dizer com antecedência, seria bom.
classpath:
na<wsdlLocation...
linha.