나는 이틀 동안 내 머리를 벽에 대고 두드렸다. 우리는 입니다. 스프링 웹 서비스 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?