IllegalAnnotationException:两个类具有相同的 XML 类型名称

Posted

技术标签:

【中文标题】IllegalAnnotationException:两个类具有相同的 XML 类型名称【英文标题】:IllegalAnnotationException: Two classes have the same XML type name 【发布时间】:2011-05-14 08:25:11 【问题描述】:

我正在 JBoss 5 和 Java 1.6 下开发 Web 服务。什么可能导致此异常?下面是我的简化网络服务代码。

@Stateless
@WebService()
public class AccountWS 

@WebMethod()
public CreateAccountResponse createAccount(@WebParam(name = "request") CreateAccountRequest request) 
    return null;

下面是完整的堆栈跟踪。

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

【问题讨论】:

【参考方案1】:

我找到了问题的原因。

出现此问题是因为 JAX-WS 为每个方法生成一个类,并且类名是通过串联methodName + "Response" 构造的。在我的例子中,JAX-WS 新生成的类将与我的响应对象同名

例子:

@Stateless
@WebService()
public class AccountWS 

    @WebMethod()
    public CreateAccountResponse createAccount(@WebParam(name = "request") CreateAccountRequest request) 
        return null;
    

JAX-WS 将为与响应对象同名的 Web 方法 createAccount 生成一个新类 CreateAccountResponse

解决方案:

确保响应对象和方法的名称不匹配。同样的事情也适用于方法参数。

【讨论】:

+1 用于分享正确的解决方案(以及有关 JAX-WS 的非常有用的信息)【参考方案2】:

您有两个 XML 架构元素,它们具有相同的名称 (createAccountResponse) 和相同的命名空间 (http://kona.webservice.sif.unidata.com/),对应于 Java 类型 com.unidata.sif.kona.account.message.CreateAccountResponsecom.unidata.sif.webservice.kona.jaxws.CreateAccountResponse。由于第二个是由 WebMethod 注释“自动”生成的,因此更改消息元素的 XMLType 注释会更容易。

要解决这个问题,您应该为其中一个更改name,或者定义两个独立的命名空间(一个用于消息元素,另一个用于WS 请求和响应组件)。我推荐最后一种方法(两个独立的命名空间)。

IE:

1.更改消息元素的名称com.unidata.sif.kona.account.message.CreateAccountResponse

@XMLType(name="CreateAccountResponseMsg", namespace="http://kona.webservice.sif.unidata.com")

2. 更改消息元素的命名空间(包com.unidata.sif.kona.account.message

@XMLType(name="CreateAccountResponse", namespace="http://kona.webservice.sif.unidata.com/message")

【讨论】:

这就是堆栈跟踪试图告诉我我相信的内容。但我不明白的是为什么我的其他网络服务没有抛出这个异常。我检查了其他网络服务,代码或多或少相似。 根据我掌握的信息,我无法告诉您这种不同行为的原因。对不起。 我找到了原因..查看我的答案。【参考方案3】:

我遇到了同样的错误,但我无法调整带有 @XmlType 注释的类(来自库) 所以另一种解决方案是提供一个com.unidata.sif.kona.account.message/package-info.java,里面有以下代码

@javax.xml.bind.annotation.XmlSchema(namespace = "http://kona.webservice.sif.unidata.com/")
package com.sopra.banking.processengine.servicecontract.v1_1.dto;

【讨论】:

【参考方案4】:

另一种解决方案是使用@WebMethod(operationName="differentFromMethodName")。这甚至会更改客户端上的接口方法名称。 JAX-WS 仍然使用 SEI 的方法名称为 wsgen 和 wsimport 生成类;但现在消息元素类与 JAX_WS 内部生成的不同。

我不想接触 wsgen 生成的类(消息元素类)。

【讨论】:

以上是关于IllegalAnnotationException:两个类具有相同的 XML 类型名称的主要内容,如果未能解决你的问题,请参考以下文章