2

jaxb と spring webservice で構築された Java Web サービス アプリケーションがあります。

次のような xsd に複雑な型があります。

...

<complexType name="GetRecordsRequest">
    <sequence>
        <element name="maxRecords" type="int" maxOccurs="1" minOccurs="1"/>
    </sequence>
</complexType>

...

xjcを使用して、xsd から jaxb クラスを生成しました。

public class GetRecordsRequest {
    protected int maxRecords;

    public int getMaxRecords() {
        return maxRecords;
    }

    public void setMaxRecords(int value) {
        this.maxRecords = value;
    }
}

spring context.xml でPayloadValidatingInterceptorを使用して、ユーザーが maxRecords の整数以外を入力できないようにしました。

<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping">
    <property name="interceptors">
        <list>
            <ref local="validatingInterceptor" />
        </list>
    </property>
</bean>

<bean id="validatingInterceptor" class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
    <property name="schema" value="/WEB-INF/schemas/webservice.xsd" />
    <property name="validateRequest" value="true" />
    <property name="validateResponse" value="true" />
</bean>

この SOAP リクエスト xml を SOAP UI に入力すると、次のようになります。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.test.com/ns1">
   <soapenv:Header/>
   <soapenv:Body>
      <ns1:GetRecordsRequest>
         <ns1:maxRecords></ns1:maxRecords>
      </ns1:GetRecordsRequest>
   </soapenv:Body>
</soapenv:Envelope>

私が受け取った応答メッセージは次のとおりです。

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Client</faultcode>
         <faultstring xml:lang="en">Validation error</faultstring>
         <detail>
            <spring-ws:ValidationError xmlns:spring-ws="http://springframework.org/spring-ws">cvc-datatype-valid.1.2.1: '' is not a valid value for 'integer'.</spring-ws:ValidationError>
            <spring-ws:ValidationError xmlns:spring-ws="http://springframework.org/spring-ws">cvc-type.3.1.3: The value '' of element 'cis:maxRecords' is not valid.</spring-ws:ValidationError>
         </detail>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

結果は、たった 1 つのフィールドに対して 2 行の不可解なメッセージであることがわかります。1行だけにして、応答メッセージをよりきれいにすることはできますか? 検証エラーの応答メッセージをカスタマイズする方法はありますか?

4

2 に答える 2

2

AbstractValidatingInterceptor (PayloadValidatingInterceptor はこの抽象クラスの実装です)のメソッドを使用して、検証エラー応答をカスタマイズできます。

  • setDetailElementName(QName detailElementName)
  • setFaultStringOrReason(String faultStringOrReason)

部分的な例:

public final class MyPayloadValidatingInterceptor
extends PayloadValidatingInterceptor {

    @Override
    protected Source getValidationRequestSource(WebServiceMessage webSerMessage_) {
        _source = webSerMessage_.getPayloadSource();
        validateSchema(_source);
        return _source;
    }

    private void validateSchema(Source source_) throws Exception {
        SchemaFactory _schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema _schema = _schemaFactory.newSchema(getSchemas()[0].getFile());

        Validator _validator = _schema.newValidator();
        DOMResult _result = new DOMResult();
        try {
            _validator.validate(source_, _result);
        } catch (SAXException _exception) {
            // modify your soapfault here                
        }
    }
}
于 2013-04-01T13:08:47.207 に答える