Spring 3 IOCを使用しているJAX-WS WebServiceがあります。私はSpringのアスペクトをコーディングして例外を処理し、コールを完了する前にWebServiceクラスでそれらが正しく処理されるようにしました。私のAspectでは、ユーザーのロケール(SOAPヘッダーで定義されている)にアクセスしたいと思っていますが、これを行う方法がわかりません。JAX-WSのSpring AspectからSOAPMessageにアクセスする方法は?
私はハンドラでロケールを取得できますが、それは私の面で私を助けません。私はWebServiceContextを注入しようとしましたが、それは常にnullです。
が周り掘り少しはそれを示すように思われhttps://issues.apache.org/jira/browse/CXF-2674に私を指摘:
- 春意図的にWebServiceContextのはSOAPMessageContext
ための薄いラッパーです
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private javax.xml.ws.handler.soap.SOAPMessageContext com.cws.cs.lendingsimulationservice.error.ServiceErrorInterceptor.webServiceContext; nested exception is java.lang.IllegalArgumentException: Can not set javax.xml.ws.handler.soap.SOAPMessageContext field com.cws.cs.lendingsimulationservice.error.ServiceErrorInterceptor.webServiceContext to java.util.LinkedHashMap
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:502) [spring-beans-3.0.5.RELEASE.jar:]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84) [spring-beans-3.0.5.RELEASE.jar:]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:282) [spring-beans-3.0.5.RELEASE.jar:]
... 21 more
Caused by: java.lang.IllegalArgumentException: Can not set javax.xml.ws.handler.soap.SOAPMessageContext field com.cws.cs.lendingsimulationservice.error.ServiceErrorInterceptor.webServiceContext to java.util.LinkedHashMap
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146) [:1.6.0_29]
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150) [:1.6.0_29]
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63) [:1.6.0_29]
at java.lang.reflect.Field.set(Field.java:657) [:1.6.0_29]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:498) [spring-beans-3.0.5.RELEASE.jar:]
... 23 more
私は、ある情報の中からこの情報にアクセスする方法が必要であることを理解していますが、その方法を理解できないようです。
SOAPMessage
オブジェクトを代わりに注入しようとすると、org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [javax.xml.soap.SOAPMessage] found for dependency
というエラーメッセージが表示されます。
誰かが正しい方向に私を向けることができますか?
おかげで、
エリック
'SOAPMessageContext'をオートワイヤリングの背後にあるアイデアは何ですか?アプリケーションレベルでは存在しません。メッセージが送受信される場合にのみ存在するため、一般的にはスコープが必要です。 IN JAX-WS 'SOAPMessageContext'がハンドラチェーンに渡されます。これは、あなたがそれを交差させ、あなたのアスペクトのためにスレッドローカルにバインドできる場所です。 –
私の考えは間違っていたと思いますが、処理の特定の場所でSOAPHeaderの何かにアクセスする必要があるという考えがありました。エンドポイントでそれを抽出し、それをパラメータとして渡すことは正しいこととは思われないので、私は特定の情報が必要なときにヘッダー(そしてConscontently MessageContext)を挿入したかったのです。それがうまくいかなかったとき、私がやったことは、Handlerで情報を抽出し、それをリクエストスコープのオブジェクトに設定し、それを必要とするクラスに注入することです。私はちょうど良い解決策があるだろうと思っていた。 –
私は同じトラック上にいると思います。「SOAPMessageContext」はSpringに関してスコープを必要とします。あなた自身の質問に対する答えとしていくつかのコードを投稿することができれば、コミュニティは感謝します。 –