2016-10-15 2 views
2

Quand j'appelle une de l'opération WSDL d'un projet de printemps, je reçois exception près - com.sun.istack.internal.SAXException2: unable to marshal type "com.pkg.wsdl.ABC" as an element because it is missing an @XmlRootElement annotationerreur dans marshalling - manque erreur d'annotation xmlrootelement

J'utilise suivant pom.xml pour générer des objets java à partir d'un WSDL (déjà utilisé par de nombreux clients) dans le cadre d'un projet de printemps -

 <groupId>org.jvnet.jaxb2.maven2</groupId> 
     <artifactId>maven-jaxb2-plugin</artifactId> 
     <version>0.13.1</version> 

Regarder la résolution des problèmes similaires i modifié le code à utiliser JAXBElement mais toujours obtenir la même erreur -

ABC vabc = new ABC(); 
    vabc.set(..) // populate vabc object 

    ObjectFactory of = new ObjectFactory(); 
    JAXBElement<ABC> jabc = of.createABC(vabc); 
    ABC oabc = jabc .getValue(); 

Marshaller Code -

Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); 
marshaller.setContextPath("com.pkg.wsdl"); 

et appeler le service Web back-end -

 ABCResp response = (ABCResp) getWebServiceTemplate() 
     .marshalSendAndReceive("http://host:port/svcname",oabc); 

Répondre

5

Had suivant les questions que je devais résoudre -
1 manquante erreur d'annotation xmlRootElement
devait passer JAXBElement lui-même dans marshalSendAndReceive comme indiqué ci-dessous.
Vous pouvez extraire les détails exacts d'ObjectFactory pour un nom QName.

2 manquant soapAction dans l'erreur de demande
a dû passer la fonction WebServiceMessageCallback comme indiqué ci-dessous pour mettre soapAction

3- classCastExcetion unmarshalling la réponse
a dû ajouter JAXBIntrospector pour corriger cette erreur

ABCResp response = (ABCResp) JAXBIntrospector.getValue(getWebServiceTemplate() 
     .marshalSendAndReceive(
       "http://host:port/svcname", 
       new JAXBElement<ABC>(new QName(uri, localpart),ABC.class,request), 
       new WebServiceMessageCallback() { 

        public void doWithMessage(WebServiceMessage message) { 
         ((SoapMessage)message).setSoapAction("/test"); 
        } 
       }));   
+0

Peut-être que c'est une meilleure idée d'utiliser des méthodes dans la classe ObjectFactory au lieu d'utiliser 'new JAXBElement (nouvelle requête QName (uri, localpart), ABC.class,) ', de cette façon vous ne serrez pas votre code avec les espaces de noms de schémas et les URI si vous les modifiez. Quelque chose comme ceci: 'ObjectFactory de = new ObjectFactory(); ABC vabc = of.createABC(); ** remplir l'objet vabc ** puis JAXBElement jabc = of.createABC (vabc); ' –