Je développe un service Web sous JBoss 5 et Java 1.6. Qu'est-ce qui pourrait éventuellement provoquer cette exception? Voici mon code de service Web simplifié.
@Stateless
@WebService()
public class AccountWS {
@WebMethod()
public CreateAccountResponse createAccount(@WebParam(name = "request") CreateAccountRequest request) {
return null;
}
Et ci-dessous est la trace complète de la pile.
16:19:03,421 ERROR [AbstractKernelController] Error installing to Real: name=vfsfile:/C:/Apps/jbdevstudio/jboss-eap/jboss-as/server/default/deploy/sif_esb.esb/ state=PreReal mode=Manual requiredState=Real
org.jboss.deployers.spi.DeploymentException: Error during deploy: vfsfile:/C:/Apps/jbdevstudio/jboss-eap/jboss-as/server/default/deploy/sif_esb.esb/
at org.jboss.deployers.spi.DeploymentException.rethrowAsDeploymentException(DeploymentException.Java:49)
at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.Java:177)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.Java:1440)
at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.Java:1158)
at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.Java:1099)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.Java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.Java:1633)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.Java:935)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.Java:1083)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.Java:985)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.Java:823)
at org.jboss.dependency.plugins.AbstractController.change(AbstractController.Java:553)
at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.Java:782)
at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.Java:702)
at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.process(MainDeployerAdapter.Java:117)
at org.jboss.system.server.profileservice.repository.ProfileDeployAction.install(ProfileDeployAction.Java:70)
at org.jboss.system.server.profileservice.repository.AbstractProfileAction.install(AbstractProfileAction.Java:53)
at org.jboss.system.server.profileservice.repository.AbstractProfileService.install(AbstractProfileService.Java:403)
at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.Java:348)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.Java:1633)
at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.Java:935)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.Java:1083)
at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.Java:985)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.Java:775)
at org.jboss.dependency.plugins.AbstractController.install(AbstractController.Java:540)
at org.jboss.system.server.profileservice.repository.AbstractProfileService.registerProfile(AbstractProfileService.Java:308)
at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.Java:256)
at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.Java:461)
at org.jboss.Main.boot(Main.Java:221)
at org.jboss.Main$1.run(Main.Java:556)
at Java.lang.Thread.run(Unknown Source)
Caused by: Java.lang.IllegalStateException: Cannot build JAXB context
at org.jboss.ws.metadata.builder.jaxws.JAXWSMetaDataBuilder.createJAXBContext(JAXWSMetaDataBuilder.Java:984)
at org.jboss.ws.metadata.builder.jaxws.JAXWSWebServiceMetaDataBuilder.buildWebServiceMetaData(JAXWSWebServiceMetaDataBuilder.Java:151)
at org.jboss.ws.metadata.builder.jaxws.JAXWSServerMetaDataBuilder.setupProviderOrWebService(JAXWSServerMetaDataBuilder.Java:50)
at org.jboss.ws.metadata.builder.jaxws.JAXWSMetaDataBuilderEJB3.buildMetaData(JAXWSMetaDataBuilderEJB3.Java:76)
at org.jboss.wsf.stack.jbws.UnifiedMetaDataDeploymentAspect.start(UnifiedMetaDataDeploymentAspect.Java:69)
at org.jboss.wsf.framework.deployment.DeploymentAspectManagerImpl.deploy(DeploymentAspectManagerImpl.Java:129)
at org.jboss.wsf.container.jboss50.deployer.ArchiveDeployerHook.deploy(ArchiveDeployerHook.Java:76)
at org.jboss.wsf.container.jboss50.deployer.AbstractWebServiceDeployer.internalDeploy(AbstractWebServiceDeployer.Java:60)
at org.jboss.wsf.container.jboss50.deployer.WebServiceDeployerEJB.internalDeploy(WebServiceDeployerEJB.Java:113)
at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.Java:50)
at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.Java:171)
... 29 more
Caused by: org.jboss.ws.WSException: Failed to create JAXBContext
at org.jboss.ws.core.jaxws.CustomizableJAXBContextFactory.createContext(CustomizableJAXBContextFactory.Java:114)
at org.jboss.ws.metadata.builder.jaxws.JAXWSMetaDataBuilder.createJAXBContext(JAXWSMetaDataBuilder.Java:980)
... 39 more
Caused by: com.Sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Two classes have the same XML type name "{http://kona.webservice.sif.unidata.com/}createAccountResponse". Use @XmlType.name and @XmlType.namespace to assign different names to them.
this problem is related to the following location:
at com.unidata.sif.kona.account.message.CreateAccountResponse
at private com.unidata.sif.kona.account.message.CreateAccountResponse com.unidata.sif.webservice.kona.jaxws.CreateAccountResponse._return
at com.unidata.sif.webservice.kona.jaxws.CreateAccountResponse
this problem is related to the following location:
at com.unidata.sif.webservice.kona.jaxws.CreateAccountResponse
at com.Sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.Java:102)
at com.Sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.Java:448)
at com.Sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.Java:297)
at com.Sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.Java:139)
at com.Sun.xml.bind.api.JAXBRIContext.newInstance(JAXBRIContext.Java:105)
at org.jboss.ws.core.jaxws.CustomizableJAXBContextFactory.createContext(CustomizableJAXBContextFactory.Java:108)
... 40 more
J'ai trouvé la cause de mon problème.
Ce problème se produit car JAX-WS génère une classe pour chaque méthode et le nom de classe est construit en concaténant methodName
+ "Response"
. Dans mon cas, la classe nouvellement générée par JAX-WS aura le même nom que mon objet de réponse.
Exemple:
@Stateless
@WebService()
public class AccountWS {
@WebMethod()
public CreateAccountResponse createAccount(@WebParam(name = "request") CreateAccountRequest request) {
return null;
}
}
JAX-WS va générer une nouvelle classe CreateAccountResponse
pour la méthode Web createAccount
qui porte le même nom que l'objet de réponse.
Solution:
Assurez-vous que le nom de l'objet et de la méthode de réponse ne correspond pas. La même chose s'applique également au paramètre de méthode.
Vous avez deux éléments de schéma XML portant le même nom (createAccountResponse
) et le même espace de noms (http://kona.webservice.sif.unidata.com/
) correspondant aux Java types com.unidata.sif.kona.account.message.CreateAccountResponse
et com.unidata.sif.webservice.kona.jaxws.CreateAccountResponse
. Comme le second est "automagiquement" généré par l'annotation WebMethod, il sera plus facile de changer l'anotation XMLType pour l'élément de message.
Pour le résoudre, vous devez modifier le name
pour l'un d'entre eux, ou définir deux espaces de noms séparés (un pour les éléments de message et un autre pour les composants de demande et de réponse WS). Je recommande la dernière approche (deux espaces de noms séparés).
C'EST À DIRE:
1. Modification du nom de l'élément de message com.unidata.sif.kona.account.message.CreateAccountResponse
.
@XMLType(name="CreateAccountResponseMsg", namespace="http://kona.webservice.sif.unidata.com")
2. Modification de l'espace de noms au niveau des éléments de message (package com.unidata.sif.kona.account.message
)
@XMLType(name="CreateAccountResponse", namespace="http://kona.webservice.sif.unidata.com/message")
Une autre solution consiste à utiliser @WebMethod(operationName="differentFromMethodName")
. Cela changera même le nom de la méthode d'interface sur le client. JAX-WS génère toujours les classes pour wsgen et wsimport en utilisant le nom de méthode du SEI; mais maintenant les classes d'éléments de message sont différentes de celles générées en interne par JAX_WS.
Je ne voulais pas toucher aux classes générées par wsgen (classes d'éléments de message).
J'ai eu la même erreur mais je n'ai pas pu ajuster les classes avec l'annotation @XmlType (provenant de la bibliothèque) Donc une autre solution est de fournir un com.unidata.sif.kona.account.message/package-info.Java
Avec le code suivant à l'intérieur
@javax.xml.bind.annotation.XmlSchema(namespace = "http://kona.webservice.sif.unidata.com/")
package com.sopra.banking.processengine.servicecontract.v1_1.dto;