JAXBException: pas une propriété valide de la classe
Nous avons une application qui a besoin de consommer un service web externe. Pour ce faire, nous avons généré l'ensemble de Java artefacts à partir du WSDL via Maven avec le wsdl2java objectif fourni par le cxf-codegen-plugin plugin.
Dans l'application que nous voulons pour définir le point de terminaison à utiliser pour l'appel de service web au moment de l'exécution (pour répondre aux différents service web Url de point de terminaison dans des environnements de test) et ont donc écrit un code comme suit pour le faire pour nous:
private <T> T createServiceObject(final Class<T> p_seiClass) throws MalformedURLException {
final Service serviceFactory = Service.create(new URL(wsdlLocation), new QName(targetNamespace, serviceName));
final T service = serviceFactory.getPort(p_seiClass);
((BindingProvider) service).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "endpoint");
return service;
}
Lorsque le code s'exécute, il échoue sur la serviceFactory.getPort ligne avec les éléments suivants exception:
javax.xml.ws.WebServiceException: class ZZZ.YYYwebservice.v5.types.ProcessUIRequestResponse do not have a property of the name ProcessUIRequestResult
at com.sun.xml.internal.ws.client.sei.ResponseBuilder$DocLit.<init>(ResponseBuilder.java:512)
at com.sun.xml.internal.ws.client.sei.SEIMethodHandler.buildResponseBuilder(SEIMethodHandler.java:172)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.<init>(SyncMethodHandler.java:86)
at com.sun.xml.internal.ws.client.sei.SEIStub.<init>(SEIStub.java:83)
at com.sun.xml.internal.ws.client.WSServiceDelegate.createEndpointIFBaseProxy(WSServiceDelegate.java:641)
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:344)
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:326)
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:364)
at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:368)
at javax.xml.ws.Service.getPort(Service.java:172)
at com.XXX.XXX.XXX.YYY.integration.facade.jaxws.ProcessUIRequestFacadeJaxws.createServiceObject(ProcessUIRequestFacadeJaxws.java:53)
at com.XXX.XXX.XXX.YYY.integration.facade.jaxws.ProcessUIRequestFacadeJaxws.processUIRequest(ProcessUIRequestFacadeJaxws.java:39)
at com.XXX.XXX.XXX.YYY.integration.facade.jaxws.ProcessUIRequestFacadeJaxwsTest.test(ProcessUIRequestFacadeJaxwsTest.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: javax.xml.bind.JAXBException: ProcessUIRequestResult is not a valid property on class ZZZ.YYYwebservice.v5.types.ProcessUIRequestResponse
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getElementPropertyAccessor(JAXBContextImpl.java:954)
at com.sun.xml.internal.ws.client.sei.ResponseBuilder$DocLit.<init>(ResponseBuilder.java:501)
... 37 more
Au fond je peux voir javax.xml.bind.JAXBException: ProcessUIRequestResult n'est pas une propriété valide de la classe ZZZ.YYYwebservice.v5.les types.ProcessUIRequestResponse qui suggère que quelque chose est incorrect avec le générés ProcessUIRequestResponse.java fichier.
J'ai regardé le fichier et ne peut rien voir du tout évident (ProcessUIRequestResult est défini dans la classe et a un getter et setter). La classe est ci-dessous:
package YYY.ZZZwebservice.v5.types;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import YYY.ZZZbase.BaseVO;
/**
* <p>Java class for anonymous complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="ProcessUIRequestResult" type="{http://YYY/ZZZbase/}BaseVO" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"processUIRequestResult"
})
@XmlRootElement(name = "ProcessUIRequestResponse")
public class ProcessUIRequestResponse {
@XmlElement(name = "ProcessUIRequestResult")
protected BaseVO processUIRequestResult;
/**
* Gets the value of the processUIRequestResult property.
*
* @return
* possible object is
* {@link BaseVO }
*
*/
public BaseVO getProcessUIRequestResult() {
return processUIRequestResult;
}
/**
* Sets the value of the processUIRequestResult property.
*
* @param value
* allowed object is
* {@link BaseVO }
*
*/
public void setProcessUIRequestResult(BaseVO value) {
this.processUIRequestResult = value;
}
public ProcessUIRequestResponse withProcessUIRequestResult(BaseVO value) {
setProcessUIRequestResult(value);
return this;
}
}
Quelqu'un a une idée de ce que le problème pourrait être? Je ne peux pas repérer quelque chose d'évident et n'ont pas été en mesure de trouver des informations pour savoir quel peut être le problème.
Merci pour votre aide à l'avance.
ÉDITION - MISE À JOUR SUR LE 20/09 BASÉ SUR LORENZO RÉPONSE
Malheureusement, le web service est un service tiers, et je n'ai pas accès pour modifier le XSDs. J'ai utilisé le serveur l'URL du WSDL lors de la génération du Java.
Cependant, comme un test, j'ai modifié le générés ProcessUIRequestResponse.java pour modifier la propriété de commencer avec une lettre majuscule pour correspondre à la WSDL et la même erreur a été levée.
Quelqu'un a une idée?
ÉDITER de nouveau sur le 26/09 À FOURNIR des MISES à jour **
J'ai fait une enquête plus approfondie sur cette question et ont trouvé que cela semble effectivement être un problème avec la façon dont le point de terminaison de service d'interface est générée. C'est ce qui est généré:
/**
* This class was generated by Apache CXF 2.5.2 2013-09-26T13:05:17.389+01:00 Generated source version: 2.5.2
*
*/
@WebService(targetNamespace = "http://zzz/yyywebservice/v5/types/", name = "Types")
@XmlSeeAlso({ zzz.yyyentityview.ObjectFactory.class, zzz.yyyview.search.postcode.ObjectFactory.class,
zzz.yyyentityview.validation.ObjectFactory.class, zzz.serializable_dictionary.ObjectFactory.class,
zzz.yyyview.search.app.ObjectFactory.class, zzz.yyybase.ObjectFactory.class, zzz.yyybase.enums.ObjectFactory.class,
zzz.yyyview.uw.ObjectFactory.class, zzz.yyyview.app.ObjectFactory.class, zzz.yyyview.search.bank.ObjectFactory.class,
zzz.yyyview.search.list.ObjectFactory.class, zzz.yyyentityview.app.ObjectFactory.class,
zzz.yyyentityview.client.ObjectFactory.class, ObjectFactory.class })
public interface Types {
@WebResult(name = "ProcessUIRequestResult", targetNamespace = "")
@ResponseWrapper(localName = "ProcessUIRequestResponse", targetNamespace = "http://zzz/yyywebservice/v5/types/", className = "zzz.yyywebservice.v5.types.ProcessUIRequestResponse")
@RequestWrapper(localName = "ProcessUIRequest", targetNamespace = "http://zzz/yyywebservice/v5/types/", className = "zzz.yyywebservice.v5.types.ProcessUIRequest")
@WebMethod(operationName = "ProcessUIRequest", action = "http://zzz/yyywebservice/v5/ProcessUIRequest")
public zzz.yyybase.BaseVO processUIRequest(
@WebParam(name = "ProcessUIRequest", targetNamespace = "http://zzz/yyywebservice/v5/types/") zzz.yyybase.BaseVO processUIRequest);
@WebResult(name = "GetActivityStatusEntityResult", targetNamespace = "")
@ResponseWrapper(localName = "GetActivityStatusEntityResponse", targetNamespace = "http://zzz/yyywebservice/v5/types/", className = "zzz.yyywebservice.v5.types.GetActivityStatusEntityResponse")
@RequestWrapper(localName = "GetActivityStatusEntity", targetNamespace = "http://zzz/yyywebservice/v5/types/", className = "zzz.yyywebservice.v5.types.GetActivityStatusEntity")
@WebMethod(operationName = "GetActivityStatusEntity", action = "http://zzz/yyywebservice/v5/GetActivityStatusEntity")
public zzz.yyybase.ActivityStatusVOBase getActivityStatusEntity(
@WebParam(name = "ProcessUIRequest", targetNamespace = "http://zzz/yyywebservice/v5/types/") zzz.yyybase.BaseVO processUIRequest);
}
Le problème est avec le @WebResult d'annotation et de la vierge targetNamespace. Quand j'ai modifier manuellement la classe et d'ajouter que je m'attends à la targetNamespace (basé sur la recherche dans le XSDs, j'ai réussi à invoquer le service web.
J'ai regardé dans le XSDs pour tout manque de définitions d'espaces de noms ou d'autres erreurs manifestes, mais je ne peux pas repérer quelque chose. Quelqu'un a une idée de où le targetNamespace ou @WebResult est généré à partir d'?
OriginalL'auteur chrishern | 2013-09-19
Vous devez vous connecter pour publier un commentaire.
Il peut être une question de la façon dont le wsdl2java est de nommage de l'emballage. Si le targetNamespace (wsdl) est en chameau cas de la notation, votre colis doit être camel cas trop. E. g.:
Pour targetNamespace="http://your.domain/WebAdminServices/WebSiteMgmt"
paquet de domaine.votre.webAdminServices.webSiteMgmt; --> FONCTIONNE 🙂
paquet de domaine.votre.webadminservices.websitemgmt; --> PAS de TRAVAUX 🙁
Espérons que cela aide,
Luis
mmm, oui, vous avez raison, merci!
OriginalL'auteur Gaucho
J'ai eu le même problème et j'ai trouvé quelque chose sur ce lien vous devriez essayer le suivant:
OriginalL'auteur Amir Jamak
Une solution de contournement: utilisez jaxws-maven-plugin à la place. https://mvnrepository.com/artifact/org.codehaus.mojo/jaxws-maven-plugin
Le même problème qui s'est passé dans mon projet. cxf ne peut pas générer de targetNamespace mais jaxws peut donner le même fichier wsdl.
OriginalL'auteur Will
Javabean les noms des propriétés sont traditionnellement en minuscules.
Vous avez une majuscule nom de la balise dans votre WSDL, c'est à dire ProcessUIRequestResult, mais une minuscule propriété processUIRequestResult dans votre classe, tacite par les noms de méthode setProcessUIRequestResult et getProcessUIRequestResult.
Le WSDL pour la génération de code Java s'affiche correctement, mais cela ne signifie pas que d'autres de la bibliothèque de code respecte le WSDL et/ou de l'annotation Java.
Pouvez-vous faire travailler avec des minuscules les noms d'élément?
Je vous ai demandé d'essayer minuscules les noms d'élément dans le fichier WSDL et documents, afin d'apaiser la (probablement buggy) de traitement de données XML partie des bibliothèques, pas les majuscules des noms de propriété dans le code de génération de la part des bibliothèques. Vous pouvez mettre en place un test avec votre propre WSDL et des documents, en mettant de côté le réel webservice vous avez besoin de consommer; vous finirez probablement la sélection d'une autre bibliothèque de toute façon.
OriginalL'auteur Lorenzo Gatti