2014-11-06 3 views
0

Я уже несколько дней ударил головой о стену. Мы являемся с использованием веб-служб 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?

ответ

1

ИТАК после делать некоторые дополнительные исследования этой проблемы является не ошибка в Spring. Кажется, будет продуктом того, как развивается анализ Sax в Java.

Основная архитектура Spring -> JAXP -> Поставщик Parser (Xerces).

Интерфейс JAXP позволяет устанавливать функции, но не предоставляет необходимый элемент управления для замены компонента ErrorReporter в синтаксическом анализаторе Xerces или . Настройка должна заключаться в создании экземпляра синтаксического анализатора Xerces с использованием специального компонента ErrorReporter и переопределения реализации Xerces , который является частью JVM.

Это просто не жизнеспособная альтернатива, когда мы пытаемся доставить продукт поверх JVM в средах, которые мы не можем контролировать.Суть в том, что у нас есть , чтобы жить с сообщениями так, как они есть.

Смежные вопросы