Lorsque je génère un client de service Web en utilisant wsdl2java à partir de CXF (qui génère quelque chose de similaire à wsimport), via maven, mes services commencent par des codes comme celui-ci:
@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;
}
Le chemin absolu codé en dur est vraiment nul. La classe générée ne fonctionnera sur aucun autre ordinateur que le mien.
La première idée est de mettre le fichier WSDL (plus tout ce qu'il importe, les autres WSDL et XSD) quelque part dans un fichier jar et le classpath. Mais nous voulons éviter cela. Puisque tout cela a été généré par CXF et JAXB basés sur les WSDL et XSD, nous ne voyons aucun intérêt à avoir besoin de connaître le WSDL au moment de l'exécution.
L'attribut wsdlLocation est destiné à remplacer l'emplacement WSDL (au moins c'est ce que j'ai lu quelque part), et sa valeur par défaut est "". Puisque nous utilisons maven, nous avons essayé d'inclure <wsdlLocation></wsdlLocation>
dans la configuration de CXF pour essayer de forcer le générateur de source à laisser le wsdlLocation vide. Cependant, cela le fait simplement ignorer la balise XML car elle est vide. Nous avons fait un hack vraiment laid et honteux, en utilisant <wsdlLocation>" + "</wsdlLocation>
.
Cela change aussi d'autres endroits:
@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;
}
Donc, mes questions sont:
Avons-nous vraiment besoin d'un emplacement WSDL même si toutes les classes ont été générées par CXF et JAXB? Si oui, pourquoi?
Si nous n'avons pas vraiment besoin de l'emplacement WSDL, quel est le moyen approprié et propre pour empêcher CXF de le générer et de l'éviter complètement?
Quels effets secondaires pourrions-nous avoir avec ce hack? Nous ne pouvons toujours pas tester cela pour voir ce qui se passe, donc si quelqu'un pouvait dire à l'avance, ce serait bien.
classpath:
in JAX Maven au lieu de CXF, omettez-le dans la<wsdlLocation...
ligne.