既存のwsdlに基づいて,webサービスのサービス側とクライアントを開発する


長い間振り回されてきましたが、今日やっと今回のウェブサービスのドッキングのニーズを完全に開発しました.
Springのバージョンは3.0.6、cxfのバージョンは2.0.13、jbossのバージョンはjboss 4.2.3 GA、jdk 6です.また、クライアントとサービス側のwsdlファイルは、お客様が提供したもので、開発するしかありません.
主にwsdl 2 javaコマンドを使って、第1のwsdlによって開発するのは比較的に順調で、別の1篇のブログを見ますhttp://kyfxbl.iteye.com/blog/1481330
しかし、2番目のwsdlファイルの開発によって悲劇になり、使用するコマンドもwsdl 2 java-p packageName-d distLocation-all xxx.wsdlです.
結果:
WSDLToJava Error: Thrown by JAXB : A class/interface with the same name "xxx.xxx.Message"is already in use. Use a class customization to resolve this conflict.
wsdlファイル自体の問題かどうかはわかりませんが、変更することはできません.そこで、以下のコマンドを使用しました.
wsdl2java -p packageName -d distLocation -all -autoNameResolution xxx.wsdl
今回は生成されましたが、発表されたとき、次のエラーが報告されました.
Schema name conflict in collection. Namespace:xxxxxx
一日もカードを押しても終わらなかったので、今日同僚が次の命令に変更する方法を見つけました.
wsdl2java -d distLocation -all xxx.wsdl
今回-pパラメータで強制的にパケット名を指定しなかった結果、cxfは多くのパケットを生成し、元のエラーを報告しなかった.
WSDLToJava Error: Thrown by JAXB : A class/interface with the same name "xxx.xxx.Message"is already in use. Use a class customization to resolve this conflict.
そして生成されたすべてのコードをプロジェクトにコピーし、削除しました.Client、_Server、Serviceの最後の3つの余分なファイル
余談ですが、wsdl 2 javaコマンドで生成されたコードは、冗長性が多いですが、一般的には以下のような種類に分けられています.見すぎると見分けられます.
第1クラスはrequest/responseのmodelクラスで、XXXRequest、XXXXRequestBodyなどのネストがある場合があります
クラス2は_Client、_Server、_Serviceの最後のクラスは、基本的に安心して削除できます
第3クラスはwebサービスインタフェースクラスと実装クラスであり、インタフェースクラスは必須であり、実装クラスはクライアントでは不要であり、サービス側では修正が必要である
第4類はpackage-infoとObjectFactoryで、保留が必要で、主にpackageNameとtargetNamespaceと関係があるようで、私もよく分かりません
そしてwebサービスインタフェース実装クラスで、削除しました

@WebService(serviceName = "inbound.webServices.ticket.saService", portName = "inbound.webServices.ticket.saServiceSoap12", targetNamespace = "urn:services-astea.huawei.cz:inbound.webServices.tickets/v1.0/saService", wsdlLocation = "file:saService.wsdl", endpointInterface = "cz.huawei.astea.services.inbound_webservices_tickets.v1_0.saservice.InboundWebServicesTicketSaServiceSoap")

の中の

wsdlLocation = "file:saService.wsdl",

削除したのはコードが生成されたと思っているので、このwsdlファイルは役に立たないはずです.
結局、起動したか、それともさっきのエラーを報告したか.
Schema name conflict in collection. Namespace:xxxxxx
最後にまた

wsdlLocation = "file:saService.wsdl",

追加しましたが、変更しただけです.

wsdlLocation = "file:/opt/xxx/saService.wsdl",

そしてこのファイルをサーバーに置いて、今回やっと成功しました.
リリースは成功しましたが、実際にsoapUIで調整すると、コードがまた異常になり、ログに基づいて位置決めすると、Springで宣言されたbeanが見つかりませんでした.
2012-04-11 21:28:06,859 ERROR [stdERR] org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'AcceptMsgImpl' is defined
私はTMDで悩んでいます.これはどうして見つからないのですか.コードにはあります.

@Service("AcceptMsgImpl")
public class AcceptMsgImpl implements AcceptMsgService
{
    
    @Autowired
    private WoCmDao woDao;

プロファイルも間違いありません:

<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
	
	<context:component-scan base-package="com.huawei.wfm.czekh" />

しかもこのコードは実は長い間使っていたので、テストは何回も測定されていて、全然問題ありません.今日はウェブサービスのインタフェースに関するものを交換しただけで、ここでbeanが異常になったのは理解できません.
以前にもcxfとspringを統合していたことを連想すると、@Autowiredに異常があり、声明のbeanが見つからないというので、springとcxfに何か分からないことがあって、注釈が使いにくいのではないかと思います.
まず問題を解決するために、ここを変更して、注釈を使わないで、普通のプロファイルで

public class AcceptMsgImpl implements AcceptMsgService {

	private WoCmDao woDao;

public void setWoDao(WoCmDao woDao) {
		this.woDao = woDao;
	}

<bean id="AcceptMsgImpl" class="com.huawei.wfm.czekh.service.impl.AcceptMsgImpl">
		<property name="transitionDao" ref="tblWfconfTransitionHibernate" />
		<property name="woDao" ref="woCmHibernateDao" />
	</bean>

これでいい、beanが見つけた.しかし、私の心の中に大きな問題が残っています.どうして注釈がだめなのですか.
同様にbeanと依存関係を注釈で構成し,このコードは全く変化しなかった.ただし、以前に関連していたウェブサービスのインタフェース、実装クラス、Modelは、別のウェブサービスのインタフェース、実装クラス、Modelに変更されました.他にはまったく変わっていないが、だめだ、分からない.
いずれにしても、問題はまだ解決しているので、まとめてみましょう.
1、wsdlファイルに問題がある場合は、できるだけwsdl 2 java-pパラメータを使わないほうがいい2、webサービス実装クラスの@WebService注釈のwsdlLocation属性をむやみに削除できない3、springとcxfが統合されていると感じたとき、springの注釈が正常ではなく、霊的に機能しないので、保険のため、使わないと問題はありません
一つの問題を残して、後でなぜかを明らかにする機会があることを望んでいます.
SpringとCXFが統合されている場合、Springの注釈が使いにくい場合がありますが、これはなぜですか.