2011-05-05 3 views
1

사전 조건 : CXF를 기반으로하는 서비스는 XSD 제한을 위반하는 데이터와 함께 요청/응답을받습니다.CXF에서 언 마샬링 오류가 발생한 경우 필드 이름을 검색하는 방법은 무엇입니까?

실제 동작 :

CVC-최대 길이 무효 : 이 경우는 CXF 같은 메시지가 오류를 반환 길이 = '28'과 값 'string_length_violated_value은'에 대한 패싯 - 유효하지 최대 길이 '13'유형 'XSDStringTypeWithLengthRestriction'

목표 : 유효하지 않은 데이터를 포함하는 필드의 이름으로 소비자에게 반환 오류. F.e. 다음과 같이 입력하십시오 :

응답에서 잘못된 데이터가 포함되어 있습니다. 'field_name'필드의 'string_length_violated_value'값이 maxLength '13'과 관련하여면 유효하지 않습니다.

나는 가능한지, 그렇다면이 필드 이름을 어디에서 가져올지를 결정하는 방법이 궁금합니다.

+0

방금 ​​"비슷한 값이 아닙니다."Unmarshalling Error가 발생하지만 문제의 요소에 대한 힌트가없는 유사한 문제가 발생했습니다. "문제가되는 값"은 예외입니다. XML 메시지에 수백 가지 요소가 있기 때문에 건초 더미에서 바늘을 찾는 것과 같습니다. 이 단계의 해결 방법은 각 요소에 대해 고유 한 (가짜) 값을 제공하는 것이고 값 (요소는 제외)이보고되므로 올바른 요소를 나타냅니다. 지루하고 똑똑하지는 않습니다. 좀 더 시간이 지나면'JAXB ValidationEventHandler' 기술을 시도 할 것입니다. – Withheld

+0

안녕하세요 다니엘, 많은 시간이 지났으므로 상세한 것은 기억하지 못합니다. 죄송합니다. 하지만 내가 말할 수있는 것은 - ValidationEventHandler가 작동하지 않는다는 것입니다. 우리가 사용한 cxf의 버전은 이것을 무시했습니다. 이것은 나쁜 소식이지만 좋은 점도 있습니다. 캡슐화 된 객체를 파헤쳐 cxf 오류에서 "좌표"(행 및 열 번호)에 대한 데이터를 얻을 수있었습니다. 이것이 우리의 해결책이었습니다. – Milkywayfarer

답변

2

이 완전히 작동합니다 있는지 확실하지 않습니다,하지만 당신은 그것을 시도 줄 수 :

당신은 JAXB의 ValidationEventHandler를 작성하고 엔드 포인트에 그 등록 할 수 있습니다.

가져 오는 ValidationEvent에는 위에서 본 기본 문자열과 기타 정보가 있습니다. 나는 거기에 중단 점을 넣고 이벤트를 파헤쳐서 추가 정보와 유용한 정보가 있는지 확인합니다.

+0

큰 감사 내가 그것을 시도하고 어떤 결과를 가져올 지 알려주십시오! – Milkywayfarer

+0

불행하게도 [ValidationEventHandler] (https://jaxb.java.net/jaxb20-ed/api/javax/xml/bind/)는 [this source] (http://stackoverflow.com/a/10227684/1864054) ValidationEventHandler.html)는 응답 동작을 변경할 수 없으며 SOAP 응답 형식을 변경할 수 없습니다. 그게 사실이야? – Withheld