opentravel.org OTA XML 要求を受け入れ、それに応じて応答する tomcat Web サービスがあります。これは、JibX OTA クラスを使用します。
これまでのところ、サービスのユーザーは POX を使用しており、非常にうまく機能しますが、新しいユーザーは SOAP を使用して、このように SOAP ヘッダーにセキュリティ資格情報を追加したいと考えています (POS xml フラグメントを配置する代わりに)...
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<wsse:Security soap:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org /wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>USERNAME</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401- wss-username-token-profile-1.0#PasswordText">SECRET</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soap:Header>
したがって、リクエストを認証するには、サービス実装クラス内からヘッダーにアクセスする必要があると思います。
SOAPヘッダーの例をチェックアウトしました。これは、inContextも含めることでヘッダーにアクセスできることを示していると思います。
public RoomListRS list(RoomListRQ roomListRQ, InContext inCtx){
....
}
したがって、このメソッド内でこれを行うことができます...
Security security = (Security ) inCtx.getAttribute("security");
その中のユーザー名トークンにアクセスできます
...サービスでこれを指定すると...
<service name="OTAService">
<service-class>com.xx.webservice.ota.HotelServiceImpl</service-class>
<operation method="list"/>
<handler-class class="org.jibx.ws.io.handler.ContextAttributeUnmarshallingInHandler">
<constructor-arg value="com.xx.shared.soap.security.Security"/>
<constructor-arg value="security"/>
</handler-class>
</service>
私はそれを正しく理解していますか?
そのため、Security クラスを作成しましたが、ヘッダー内の何かにアクセスできることを証明するために、すべての名前空間を省略して開始しました。このようなフラグメントを持つことに基づいて...
<Security>
<UsernameToken>
<Username>USERNAME</Username>
<Password>SECRET</Password>
</UsernameToken>
</Security>
だから私はbindgenでバインディングを作成し、コンパイルしてからsoapUIで呼び出しました
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.opentravel.org/OTA/2003/05">
<soapenv:Header>
<Security>
<UsernameToken>
<Username>USERNAME</Username>
<Password>SECRET</Password>
</UsernameToken>
</Security>
</soapenv:Header>
<soapenv:Body>
<OTA_HotelRoomListRQ xmlns="http://www.opentravel.org/OTA/2003/05" Version="2.0">
....
</OTA_HotelRoomListRQ>
</soapenv:Body>
</soapenv:Envelope>
しかし、コンテキストから Security オブジェクトを取得しようとすると、null になります。
スティックの端が間違っていますか?
もっと SOAPY を使用して、別のエンドポイントを持つ別のサービスを作成する必要がありますか?
私がやろうとしていることは、JibX WS と inHandler では不可能ですか?
どんなコメントでも大歓迎です。
私の質問に答えてくれてありがとう。
私はあなたが追加したものを調べようとしています。あなたのカスタマイズと xsd を使用して、Java ソースと binding.xml を作成しました。
クラスをコンパイルしてバインドしようとしていますが、次のエラーが発生します。
C:\Java\wsse>java org.jibx.binding.generator.BindGen org.oasisopen.docs.wss.oasis200401wsswssecuritysecext1.SecurityHeaderType
Exception in thread "main" java.lang.IllegalStateException: No way to handle type java.lang.Object, referenced from org.oasisopen.docs.wss.oasis200401wsswssecuritysecext1.SecurityHeaderType
at org.jibx.binding.generator.BindGen.expandReferences(BindGen.java:227)
at org.jibx.binding.generator.BindGen.findReferences(BindGen.java:1010)
at org.jibx.binding.generator.BindGen.generate(BindGen.java:1124)
at org.jibx.binding.generator.BindGen.main(BindGen.java:1302)
bindgen のカスタマイズを調べて、この問題に対応する唯一の手がかりになるかどうかを確認します。これをどのように回避したか教えていただけますか?
再度、感謝します。