2010-11-23 12 views
28

私はJBoss 5とJava 1.6の下でWebサービスを開発しています。この例外を引き起こす可能性があるのは何ですか?以下は私の単純化されたWebサービスコードです。IllegalAnnotationException:2つのクラスが同じXMLタイプ名を持っています

@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 

答えて

73

私は私の問題の原因を発見しました。

この問題は、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を生成します。

ソリューション:

は、レスポンスオブジェクトとメソッドの名前が一致していないことを確認してください。同じことがメソッドのパラメータにも適用されます。

+9

正しい解決策を共有するための+1(JAX-WSに関する非常に有用な情報) –

9

あなたは、Javaの型com.unidata.sif.kona.account.message.CreateAccountResponsecom.unidata.sif.webservice.kona.jaxws.CreateAccountResponseに対応する同じ名前(createAccountResponse)と同じ名前空間(http://kona.webservice.sif.unidata.com/)との2つのXMLスキーマ要素を持っています。 2つ目はWebMethodアノテーションによって生成される「自動」であるため、メッセージ要素のXMLTypeアノテーションを簡単に変更できます。

解決するには、nameのいずれかを変更するか、2つの分離した名前空間を定義する必要があります(メッセージ要素用とWS要求要素用と応答要素用)。私は最後のアプローチ(2つの分離された名前空間)をお勧めします。

すなわち:

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") 
+0

内側に次のコードでcom.unidata.sif.kona.account.message/package-info.javaを提供することであり、私は同じエラーを得たが、私は(ライブラリから来る)@XmlType注釈 を持つクラスをajustことができませんでしたトレースは私が信じていると伝えようとしている。しかし、私が理解できないのは、他のWebサービスがこの例外をスローしない理由です。私は他のWebサービスと比較して、コードは多かれ少なかれ類似しています。 –

+0

私が持っている情報では、この異なる行動の理由を教えてもらえません。ごめんなさい。 –

+0

原因を見つけました。私の答えをチェックアウトしてください。 –

2

もう1つの解決策は、@WebMethod(operationName="differentFromMethodName")です。これにより、クライアント上のインターフェイスメソッド名も変更されます。 JAX-WSは、SEIのメソッド名を使用してwsgenとwsimportの両方のクラスを生成します。メッセージ要素のクラスは、内部的に生成されたJAX_WSクラスとは異なります。

私はwsgenで生成されたクラス(メッセージ要素クラス)に触れたくありませんでした。

2

だから、別の解決策は何スタックである

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