192 votes

Comment faire pour éviter d’avoir à spécifier l’emplacement WSDL dans un CXF ou JAX-WS générée client webservice ?

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:

  1. 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?

  2. 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?

  3. 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.

239voto

Kyle Points 1301

J’ai enfin trouvé la bonne réponse à cette question aujourd'hui.

Notez que j’ai précédée la valeur dans avec . Cela indique le plugin qui le wsdl sera sur le chemin de classe au lieu d’un chemin absolu. Puis il génère un code similaire à celui-ci :

22voto

BPS Points 455

Nous utilisons

En d’autres termes, utilisez un chemin d’accès par rapport à la variable classpath.

Selon moi, que le fichier WSDL peut être nécessaire lors de l’exécution pour la validation des messages pendant le maréchal/démarshaler.

10voto

Daniel Kulp Points 8782

1) Dans certains cas, oui. Si le WSDL contient des choses comme les Politiques et les telles que direct le comportement d'exécution, puis le WSDL peut être nécessaire lors de l'exécution. Les artefacts ne sont pas générés pour la politique relative des choses et d'autres. Aussi, dans quelque obscure RPC/Literal cas, pas tous les espaces de noms qui sont nécessaires sont de sortie dans le code généré (par spec). Ainsi, le wsdl serait nécessaire pour eux. Obscur cas.

2) j'ai pensé à quelque chose comme travail. Quelle est la version de CXF? Cela ressemble à un bug. Vous pouvez essayer une chaîne vide (juste des espaces). Pas sûr si cela fonctionne ou pas. Cela dit, dans votre code, vous pouvez utiliser le constructeur qui prend l'URL du WSDL et juste de passer la valeur null. Le wsdl ne serait pas utilisé.

3) les limitations ci-dessus.

6voto

raisercostin Points 1489

J’ai été en mesure de générer

en configurant le fichier pom pour avoir une valeur null pour wsdlurl :

4voto

Niraj Singh Points 69

Est-il possible que vous pouvez éviter d’utiliser wsdl2java ? Vous pouvez immédiatement utiliser CXF FrontEnd APIs pour appeler votre service Web SOAP. Le seul hic, c’est que vous devez créer votre SEI et VOs votre côté client. Voici un exemple de code.

Vous pouvez voir le tutoriel complet ici http://weblog4j.com/2012/05/01/developing-soap-web-service-using-apache-cxf/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X