15

私は Apache CXF Web サービスに取り組んでいます (SOAP 経由で JAX-WS を使用)。サービス自体は非常に単純です。リクエストを受け取り、リクエストをデータベースに挿入し、挿入が成功したかどうかを返します。リクエストにいくつかの制約を適用するために、XML 検証に頼りたいと思います。

それで、私の質問です。サービスのクライアントに詳細な検証エラーを返すにはどうすればよいですか? エンドポイントを構成して、サーバー側で検証を有効にしました。

<jaxws:endpoint id="someEndpoint" implementor="#someImpl" address="/impl">
    <jaxws:properties>
        <!-- This entry should- ideally- enable JAXB validation
        on the server-side of our web service. -->
        <entry key="schema-validation-enabled" value="true" />
    </jaxws:properties>
</jaxws:endpoint>

私は、サーバー上でインターセプター (BareInInterceptor など) を使用し、何らかの方法で SAXParseExceptions をキャッチしてそれらをラップし、クライアントに送信することを検討しました。このアプローチは少し複雑に思えますが、クライアントの XML が無効な場合は、何らかの方法でクライアントに行番号を与える必要があります。インターセプターを使用して例外を公開する必要がありますか?

私はこのテクノロジー スタックについてあまり経験がなく、Web サービスを始めたばかりです。皆さんからのアドバイスをいただければ幸いです。

4

1 に答える 1

28

カスタム ValidationEventHandler を使用して、行番号を挿入して検証エラー メッセージをオーバーライドできます。

package example;

import javax.xml.bind.ValidationEvent;
import javax.xml.bind.helpers.DefaultValidationEventHandler;

public class MyValidationEventHandler extends DefaultValidationEventHandler {    
    @Override
    public boolean handleEvent(ValidationEvent event) {
        if (event.getSeverity() == ValidationEvent.WARNING) {
            return super.handleEvent(event);
        } else {
            throw new RuntimeException(event.getMessage()
                + " [line:"+event.getLocator().getLineNumber()+"]");
        }
    }
}

このハンドラーを使用するようにエンドポイントを構成する場合:

<jaxws:endpoint id="someEndpoint" implementor="#someImpl" address="/impl">
    <jaxws:properties>
        <entry key="schema-validation-enabled" value="true" />
        <entry key="jaxb-validation-event-handler">
            <bean class="example.MyValidationEventHandler" />
        </entry>
    </jaxws:properties>
</jaxws:endpoint>

次に、次のような SOAP エラーが発生します。

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Client</faultcode>
            <faultstring>Unmarshalling Error: Not a number: xyz [line: 6]</faultstring>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

jaxb-validation-event-handler プロパティはごく最近 CXF に追加されたばかりなので、最新バージョンを使用していることを確認する必要があります - 私はこれを 2.2.5 でテストしました。

于 2010-02-05T23:46:33.737 に答える