2014-11-06 5 views
0

나는 이틀 동안 내 머리를 벽에 대고 두드렸다. 우리는 입니다. 스프링 웹 서비스 2.1.3.RELEASE를 사용하고 XSD 스키마 유효성 검사 오류를 캡처하기 위해 PayloadValidatingInterceptor의 간단한 하위 클래스를 추가했습니다.Spring에서 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 또는 XMLErrorReporter가 스키마 유효성 검사기 에서 Spring이 생성하는 MessageFormatter를 바꿔야합니다. Xerces는 오류 기자를 대체하기위한 표준 속성을 제공합니다. 그러나 Spring은 이것을 쉽게 만들지 않습니다.Jaxp13ValidatorFactory라는 하드 코드 된 JAXP 팩토리를 사용하여 XMLClient를 생성합니다.이 객체는 각 요청 처리시 Xerces 유효성 검사기 생성을 본질적으로 래핑합니다. XMLValidator에서는 이 유효성 검사기 구현에 대한 속성 설정을 허용하지 않습니다. 이 만듭니다.

나는 정의의 Xerces의 구성뿐만 아니라 다른 가능한 해킹 살펴 보았다,이 시점에서 내가 생각할 수있는 유일한 것은이 내가 할 수있는 내 자신의 유효성 검사기를 만들 XsdValidationInterceptor 의 handleRequest 루틴을 오버라이드 (override)하는 입니다 필요에 따라 구성하십시오.

아무도 더 좋은 아이디어가 있습니까?

이 여기에 질문 같은 질문이지만, 불행히도 대답하지 :

How can I provide custom error messages using JAXP DocumentBuilder?

답변

1

확인이 문제가 봄의 잘못이 아닙니다 좀 더 연구를하고 후에 이렇게. Java에서 Sax 구문 분석 방식의 제품이 진화 한 것 같습니다.

기본 아키텍처는 Spring -> JAXP -> Parser Provider (Xerces)입니다.

JAXP 인터페이스는 기능을 설정할 수 있지만 Xerces 파서의 ErrorReporter 구성 요소를 대체하기 위해 필요한 컨트롤을 제공하지 않으며 사용자 지정도 제공하지 않습니다. 사용자 정의에는 Xerces 파서 인스턴스 을 사용자 정의 ErrorReporter 구성 요소와 함께 구축하고 JVM의 일부인 Xerces 구현 을 재정의하는 것이 포함됩니다.

우리가 제어 할 수없는 환경에서 제품을 JVM 맨 위에 전달하려고 할 때 이것은 실용적인 대안이 아닙니다.요점은 그들이 메시지와 함께 사는 방법은 입니다.