0

SOAP 本体で見つかった SOAP 障害を、Spring Web サービスで見つかった応答の SOAP ヘッドに移動する最良の方法は何ですか? 例はありますか?

障害をインターセプトできますが、このリゾルバーで何かを変更できるとは思いません。

public class LisSoapFaultTranslatorExceptionResolver extends SoapFaultMappingExceptionResolver {

    @Override
    protected void customizeFault(Object endpoint, Exception ex, SoapFault fault) {

        fault = null;
    }
}
4

2 に答える 2

2

W3Schoolsから、

オプションの SOAP Fault 要素は、エラー メッセージを示すために使用されます。

Fault 要素が存在する場合は、Body 要素の子要素として表示される必要があります。Fault 要素は、SOAP メッセージに 1 回だけ表示できます。

SOAP エラーが応答の先頭にある場合、SOAP エンベロープはもはや仕様に従っていません。あなたはそれをすべきではありません。また、SOAP インターフェースを実装するフレームワークでそれが可能になるとは思えません。

SOAP エラー情報を運ぶものとして認識されるために、SOAP メッセージは、SOAP Body の唯一の子要素情報項目として、単一の SOAP Fault 要素情報項目を含まなければなりません。

スペックから

SOAP エラー情報を運ぶものとして認識されるために、SOAP メッセージは、SOAP Body の唯一の子要素情報項目として、単一の SOAP Fault 要素情報項目を含まなければなりません。

障害を生成するとき、SOAP 送信者は追加の要素情報項目を SOAP Body に含めてはなりません。Body に Fault と追加の要素情報項目が含まれるメッセージには、SOAP 定義のセマンティクスはありません。

SOAP Fault 要素情報項目は、SOAP ヘッダー ブロック内に表示されるか、SOAP Body の子要素情報項目の子孫として表示される場合があります。このような場合、要素には SOAP 定義のセマンティクスがありません。

重要な部分はthe element has no SOAP-defined semantics、これを行うかどうかです。私はあなたがこれについてあなた自身だと思います。障害がない場合は、Spring を使用して SOAP 応答を生成するか、それ以外の場合は自分で生成します。

于 2013-03-20T15:58:11.780 に答える
1

ヘッダーに項目を追加することで、このようにすることができます。

春の設定ファイル:

<sws:interceptors>    
    <sws:payloadRoot
    namespaceUri="http://www.imsglobal.org/services/lis/cmsv1p0/wsdl11/sync/imscms_v1p0">
        <bean class="com.openclass.adapter.interceptors.LisResponseInterceptor"/>    
    </sws:payloadRoot>  
</sws:interceptors>

Java コード:

public class LisResponseInterceptor extends EndpointInterceptorAdapter {

    @Override
    public boolean handleResponse(MessageContext messageContext, Object endpoint{
        return true;
    }

    @Override
    public boolean handleRequest(MessageContext messageContext, Object endpoint){
        return true;
    }

    @Override
    public boolean handleFault(MessageContext messageContext, Object endpoint){

        SoapMessage response = (SoapMessage) messageContext.getResponse();
        SoapHeader header = response.getSoapHeader();
        header.addHeaderElement(new QName("ims","imsx_syncRequestHeaderInfo"));

        return true;
    }
}
于 2013-03-20T17:25:03.437 に答える