2012-01-05 5 views
13

JAXB 비 정렬에 문제가 있습니다. 나는 제대로 코딩했다고 생각하지만, unmarshalled 객체는 null 파라미터를 반환한다. 결과적으로, 나는 언 마샬링 할 때 JAXB가 기대하는 적절한 XML 구조를 보지 못하고 있다고 가정하고있다. 그러나 오류 메시지 나 예외가 발생하지 않습니다.JAXB 비 정렬 화를 디버깅하는 방법은 무엇입니까?

언 마샬링 프로세스를 통해 단계적으로 내 개체를 채우지 못하는 이유를 정확히 알 수 있습니까?

실제 비 정렬 화 코드

은 매우 평범한입니다 : 그러나

public <T> T unmarshall(Node node, Class<T> clazz) throws JAXBException { 
    // Creating an unmarshaller 
    Unmarshaller u = JAXBContext.newInstance(clazz).createUnmarshaller(); 

    // unmarshal an instance node into Java content 
    return clazz.cast(u.unmarshal(node, clazz).getValue()); 
} 

, 내가 그것을 호출 할 때, 나는 형 clazz에의 목적은 (예상대로) 반환받을 만 채워지지.

언 마샬하려는 DOM 개체가 타사 API에 의해 생성되었습니다. 나는 이미 언 마샬링 (unmarshalling)과 함께 극도로 이상한 행동을하기 때문에이 과정을 디버그 할 수 있기를 바랍니다. 예를 들어 DOM 객체 (예 : doc.getByElementName ("myElement"). item (0)) 내의 하위 요소를 비 정렬 화하려고하면 자동으로 실패합니다. 그러나 문서를 문자열로 변환하고 새 문서로 다시 가져온 다음 변환하면됩니다.

이 문제를 디버깅하는 방법을 알지 못해서 상당히 실망하게되었습니다.

모든 통계를 제공해 주셔서 감사합니다. 당신이 걸릴 수

에릭

답변

7

한 가지 방법은 주석이 달린 클래스에서 XML 스키마를 생성하기 위해 JAXB를 사용하는 것입니다. 이것은 JAXB가 입력 문서가 어떻게 보이는지를 나타냅니다. 그런 다음이 XML 스키마에 대해 XML 문서의 유효성을 검사하여 JAXB의 기대치를 준수하는지 확인하십시오. 링크에 대한

+0

감사합니다. 결코 전에 그것을 시도하지 않았다; 그것을 줄 것이다. 그러나 XSD에서 JAXB 클래스를 생성 했으므로 거꾸로 돌아가는 것처럼 보입니다. 그러나 나는 여전히 그것을 우아한 해결책으로 생각하지 않습니다. JAXB는 완벽한 블랙 박스처럼 행동하고 있으며, 무엇을하고 있는지를 설명하는 지표가 없기 때문에 왜 그것이 실패하고 있는지 전혀 알 수 없습니다. 나는 그것이 무엇을하는지 그리고/또는 문제가있는 곳을 "볼"수있는 방법을 찾고 싶다. –

+0

제안 해 주셔서 감사합니다. 나는 validator를 사용해 보았고 이해가되지 않는 오류가 발생했습니다. 나는 그것을 위해 별도의 스레드를 만들었습니다 (http://stackoverflow.com/questions/8761930/jaxb-unmarshal-validation-throws-cvc-elt-1-cannot-find-the-declaration-of-eleme). 당신이 뭔가 제안 할 수 있다면, 나는 그것을 크게 감사 할 것입니다. 감사. –

+0

실제로 [다른 접근법] (http://stackoverflow.com/a/10227684/1864054)은 단순히 좋은 결과 및/또는 생산적인 결과를 산출하지 못하기 때문에 지금까지 발견 한 최선의 방법입니다. 그러나 테스트 메시지를 생성하는 데는'soapUI'를 사용하는 것이 좋을 것입니다. 왜냐하면 에러가 발생하는 모든 것을 수동으로 입력하도록 강요합니다 (특히 큰 메시지의 경우). 대신 Altova의 XMLSpy는 이상하게 작동합니다. SOAP 메뉴에서'새 SOAP 요청 만들기 '항목을 선택하면됩니다. 완벽하게 작동하는 (가짜) 메시지를 얻었 으면 – Withheld

10
JAXBContext context = JAXBContext.newInstance(jaxbObjectClass); 
Unmarshaller unmarshaller = context.createUnmarshaller(); 
unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler()); 
+1

이 코드 스 니펫이 질문에 어떻게 대답하는지에 대한 의견 또는 두 가지 DefaultValidationEventHandler는 이전 JAXB 1.0 핸들러입니다. 이전 핸들러가보다 자세한 에러 메시지를 내뱉기 때문에 이것을 대답으로 제안하고 있습니까?JavaDoc을에서 – Ryan

+0

: 공용 클래스 DefaultValidationEventHandler 는 이 검증 이벤트 핸들러를 기본에만 ValidationEventHandler의 JAXB 1.0을 구현하는 객체 확장합니다. 이것은 JAXB 1.0 바인딩 컴파일러에 의해 생성 된 스키마 파생 코드를 관리하는 JAXBContext에서 생성 된 모든 객체에 대한 기본 처리기입니다. 이 처리기는 첫 번째 오류 또는 치명적인 오류가 발생하면 언 마샬 및 유효성 검사 작업이 실패하게됩니다. – superbAfterSemperPhi

관련 문제