Lorsque je créer un service client à l'aide de wsdl2java de CXF (qui génère quelque chose de semblable à wsimport), via maven, mes services commence avec les codes comme ceci:
@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;
}
La codé en dur chemin d'accès absolu, ça craint vraiment. La classe générée ne fonctionne pas dans n'importe quel autre ordinateur autre que le mien.
La première idée est de mettre le fichier WSDL (plus de tout, il importe, d'autres fichiers wsdl et XSDs) quelque part dans un bocal de fichier et le chemin de classe. Mais nous voulons éviter cela. Depuis tous que la chose a été généré par CXF et JAXB basé dans le langage wsdl et XSDs, nous ne voyons pas de point d'en avoir besoin de connaître le WSDL lors de l'exécution.
Le wsdlLocation attribut est destiné à remplacer l'emplacement WSDL (du moins c'est ce que j'ai lue quelque part), et la valeur par défaut est "". Puisque nous sommes à l'aide de maven, nous avons tenté d'inclure <wsdlLocation></wsdlLocation>
à l'intérieur de la configuration de CXF pour tenter de forcer la source générateur de quitter le wsdlLocation vide. Toutefois, ceci ne fait-il ignorer la balise XML parce qu'elle est vide. Nous avons fait un vraiment laid honteux bidouillage, à l'aide de <wsdlLocation>" + "</wsdlLocation>
.
Cela change 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 les suivantes:
Ne nous vraiment besoin d'un emplacement WSDL, même si toutes les classes ont été générés par CXF et JAXB? Si oui, pourquoi?
Si nous n'avons pas vraiment besoin de l'emplacement WSDL, quelle est la bonne et propre façon de faire CXF pas les générer et de les éviter complètement?
Ce mauvais effets secondaires nous avons pu obtenir avec ce hack? Nous ne pouvons toujours pas fait de test pour voir ce qui se passe, donc si quelqu'un pouvait dire à l'avance, ce serait sympa.