2

Sping-WS (2.1) を使用して Spring プロジェクトで開発しています。

PayloadValidatingInterceptor を使用すると、Spring Mock または soapUI を介して送信するメッセージは無効と評価されます。

XSD を数回確認しましたが、データとスキーマが正しいことを確認しました。springframework.xml-validator エンジンと javax.xml.validation クラスを使用して SpringJUnit4ClassRunner 内に 2 つのテスト ケースを実装し、スキーマに対して WS の外部のペイロードを検証しました。それらは有効です。

WS 内の検証が手動検証と異なる動作をする理由を知っている人はいますか?

4

1 に答える 1

1

私もいくつか問題がありPayloadValidatingInterceptorました。ここで読んだ内容に基づいて、簡単な代替案を作成しました。インターセプターが期待どおりに機能しない場合があります。StringReaderベースではなくベースにすることでString問題が解決しました。おそらくこれはあなたの問題を解決するのにも役立つでしょう!


そこで与えられた解決策を詳しく説明するために、インターセプターを次のようなプロキシクラスに置き換えることができます。

import java.io.StringReader;
import java.io.StringWriter;

import org.springframework.ws.client.WebServiceTransformerException;
import org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.springframework.ws.WebServiceMessage;

public class PayloadValidatingInterceptorWithSourceFix extends
        PayloadValidatingInterceptor {

    @Override
    protected Source getValidationRequestSource(WebServiceMessage request) {
        return transformSourceToStreamSourceWithStringReader(request
                .getPayloadSource());
    }

    @Override
    protected Source getValidationResponseSource(WebServiceMessage response) {
        return transformSourceToStreamSourceWithStringReader(response
                .getPayloadSource());
    }

    Source transformSourceToStreamSourceWithStringReader(
            Source notValidatableSource) {
        final Source source;
        try {
            Transformer transformer = TransformerFactory.newInstance()
                    .newTransformer();

            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,
                    "yes");
            transformer.setOutputProperty(OutputKeys.INDENT, "no");
            StringWriter writer = new StringWriter();
            transformer.transform(notValidatableSource,
                    new StreamResult(writer));

            String transformed = writer.toString();
            StringReader reader = new StringReader(transformed);
            source = new StreamSource(reader);

        } catch (TransformerException transformerException) {
            throw new WebServiceTransformerException(
                    "Could not convert the source to a StreamSource with a StringReader",
                    transformerException);
        }

        return source;
    }
}

のように使用します

<bean id="payloadValidatingInterceptorWithSourceFix"
    class="path.to.your.PayloadValidatingInterceptorWithSourceFix">
    <property name="schema"
        value="file:WebContent/WEB-INF/schemas/account-balance-service.xsd" />
    <property name="validateRequest" value="true" />
    <property name="validateResponse" value="true" />
</bean>
于 2013-01-23T09:43:06.277 に答える