0
私はJava7とJAX-WSでSOAP Webサービスを開発しました。これは、インターフェイスの抜粋です:JAX-WS SOAPハンドラのWebメソッドパラメータへのアクセス?
@WebService(name = "MyWebService",
targetNamespace = "http://www.something.com")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface MyWebServiceInterface
{
@WebMethod(operationName = "handleMsg",
action = "handleMsg")
@Oneway
void handleMsg(@WebParam(name = "MessageHeader",
targetNamespace = "http://www.something.com",
header = true,
partName = "header")
MessageHeader header,
@WebParam(name = "MessageBody",
targetNamespace = "http://www.soemthing.com",
partName = "body")
MessageType body);
}
私はいくつかの追加のものを行うために、このWebサービス(それが仕事の罰金)にカスタムSOAPハンドラを実装しました。メソッドhandleFault(..)
では、Webメソッドの元のMessageHeader
にアクセスする必要があります(上記のインタフェースを参照)。これはどうすればできますか?
public class MyHandler implements SOAPHandler<SOAPMessageContext>
{
// ...
@Override
public boolean handleFault(final SOAPMessageContext context)
{
final Boolean outbound =
(Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
// handle only incoming message which do have a message set
if (outbound != null && !outbound.booleanValue() && context.getMessage() != null)
{
MessageHeader header =
getOriginalHeaderOfFautlyMessage(); // <-- how can this be done?
}
}
}
わかりました。私は 'soapHeader.getElementsByTagName(..)'を使って個々の要素を取り出し、手作業で 'MessageHeader'を構築することができます。それをスピードアップし、完全に生成されたオブジェクトを取得する方法はありますか?どういうわけか、それはすでにもう一方の方法です。 –
@MarkusL CXFを使用していますか?もしそうなら、あなたのハンドラがUNMARSHALL段階を過ぎて呼び出された場合、あなたのWebメソッドparamsがList parameters = soapMessage.getContent(List.class)にあります。 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.cxf/cxf-api/2.7.17/org/apache/cxf/interceptor/DocLiteralInInterceptor.java#DocLiteralInInterceptor およびhttp://cxf.apache.org/docs/interceptors.html – MGorgon
いいえ、私はJAX-WSで純粋なJavaを使用しています! –