Весенний PayloadValidatingInterceptor оценивает XML (неверно) как недействительный

Я разрабатываю проект Spring с использованием Sping-WS (2.1).

Используя PayloadValidatingInterceptor, сообщения, которые мы отправляем через Spring Mock или soapUI, оцениваются как недействительные.

Мы несколько раз проверили XSD и уверены, что данные и схема верны. Я реализовал два тестовых примера внутри нашего SpringJUnit4ClassRunner, используя движок springframework.xml-validator и классы javax.xml.validation для проверки полезной нагрузки вне WS по схеме. Там они действительны.

Кто-нибудь знает причину, по которой проверка внутри WS отличается от ручной проверки?


person steyze    schedule 17.01.2013    source источник
comment
После некоторого теста с различными конфигурациями XSD я понял, что при проверке в перехватчике возникает проблема с идентификацией неквалифицированных атрибутов. Квалифицированные работают.   -  person steyze    schedule 17.01.2013


Ответы (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>
person evandongen    schedule 23.01.2013
comment
Спасибо. Вы спасли мой день. ;) Реализация, описанная в связанном блоге, работает. - person steyze; 23.01.2013
comment
тоже спас мой день, слишком долго бился об это головой. - person eis; 04.03.2013