Я уже несколько дней ударил головой о стену. Мы являемся с использованием веб-служб Spring 2.1.3.RELEASE, и я добавил простой подкласс PayloadValidatingInterceptor для захвата ошибок проверки схемы XSD.Заменить XML MessageFormatter весной PayloadValidatingInterceptor
конфигурации:
<bean id="xsdValidationInterceptor" class="foo.bar.endpoint.interceptors.XSDValidatingInterceptor">
<property name="schemas">
<list>
<value>classpath:/xsd/requestName.xsd</value>
</list>
</property>
<property name="validateRequest" value="true"/>
<property name="validateResponse" value="true"/>
</bean>
XsdValidationInterceptor переопределяет handleRequestValidationErrors:
@Override
protected boolean handleRequestValidationErrors(
MessageContext messageContext, SAXParseException[] errors)
throws TransformerException {
if (getAddValidationErrorDetail()) {
messageContext.setProperty(MessageContextConstants.KEY_SCHEMA_ERRORS, errors);
}
return true;
}
До сих пор так хорошо. Эта проблема представляет собой формат сообщений, которые возвращаются из парсера Xerces . Проблема в том, что я хочу имя поля и номера строк/столбцов для , где произошла ошибка без необходимости выкапывать его из длинной строки, что отличается для различных ошибок. Похоже, это должно быть просто, но весна делает , похоже, не так просто. И как только ошибка появляется в процедуре handleRequestValidationErrors , сообщения об исключениях уже отформатированы.
В частности, я хотел бы либо заменить XMLErrorReporter или MessageFormatter что XMLErrorReporter использует в схеме валидатор , которая создает Spring. Xerces предоставляет стандартное свойство для замены репортера ошибок ; однако Spring не делает это легко. Он использует жесткий JAXP-завод под названием Jaxp13ValidatorFactory для создания объекта XMLValidator, который по существу завершает создание валидатора Xerces при каждой обработке запроса. XMLValidator не позволяет устанавливать свойства в реализациях валидатора, он создает .
Я посмотрел на пользовательской конфигурации Xerces, а также других возможных взломов, и в этот момент единственное, что я могу думать, переопределить процедуру handleRequest в XsdValidationInterceptor создавать свои собственные валидаторы, что я могу настройте по мере необходимости.
У кого-нибудь есть идеи?
Это тот же вопрос, заданный здесь, но, к сожалению, не ответил:
How can I provide custom error messages using JAXP DocumentBuilder?