2012-05-22 3 views
3

몇 가지 하위 요소가있는 JAXBElement를 marhsalling 할 때이 예외가 발생합니다. 이 예외의 원인이되는 자식 요소를 찾아내는 방법을 어떻게 알 수 있습니까? JAXB 마샬링에서 JAXB 마샬링 예외를 유발 한 자식 요소를 식별하는 방법은 무엇입니까?

java.lang.NullPointerException 
    at com.sun.xml.bind.v2.runtime.property.AttributeProperty.getIdValue(AttributeProperty.java:128) 
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.getId(ClassBeanInfoImpl.java:320) 
    at com.sun.xml.bind.v2.runtime.reflect.TransducedAccessor$IDREFTransducedAccessorImpl.print(TransducedAccessor.java:290) 
    at com.sun.xml.bind.v2.runtime.reflect.TransducedAccessor$IDREFTransducedAccessorImpl.print(TransducedAccessor.java:271) 
    at com.sun.xml.bind.v2.runtime.property.AttributeProperty.serializeAttributes(AttributeProperty.java:101) 
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeAttributes(ClassBeanInfoImpl.java:375) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:689) 
    at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:158) 
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:358) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) 
    at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:158) 
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:358) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) 
    at com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:69) 
    at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:172) 
    at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:159) 
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:358) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) 
    at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:158) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:161) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:131) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:333) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:340) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:76) 
    at com.sun.xml.bind.v2.runtime.property.SingleReferenceNodeProperty.serializeBody(SingleReferenceNodeProperty.java:115) 
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:358) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) 
    at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:158) 
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:358) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) 
    at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:158) 
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:358) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) 
    at com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:69) 
    at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:172) 
    at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:159) 
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:358) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:156) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:131) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:333) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:340) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:76) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494) 
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:323) 
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:251) 
    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75) 
    at com.tdsecurities.fxdev.doddfranktdmladapter.SwapTDMLGeneratorJunitTest.testHello(SwapTDMLGeneratorJunitTest.java:113) 

는 I 마샬 Jaxbelment에 사용하는 코드이다

JAXBElementdmlJAXBElement = SwapDMLGenerator.generateDML (이벤트 leg1ordMm, leg2ordMm, leg1OrdCs, leg2OrdCs)를; I는 생각할 수

JAXBContext jaxbContext_m = JAXBContext.newInstance(DmlWrapper.class); 
Marshaller marshaller = jaxbContext_m.createMarshaller(); 
//marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, ""); 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);   
String outFileName= String.format("dml-%d-ordm_deallnum-%s.xml",System.currentTimeMillis(), .getDealNumber()); 
File fout= new File(destDir, outFileName); 
FileOutputStream fos= new FileOutputStream(fout); 
marshaller.marshal(dmlJAXBElement, fos); 
fos.close(); 

답변

0

한 가지 방법은 프로젝트의 JAXB의 소스 코드, 디버그 모드에서 프로그램을 실행하고 이클립스 조건부 중단 점을 넣어를 포함한다. How to set a conditional break point in eclipse NPE를 얻고 있기 때문에 조건은 속성이 null이라는 것입니다. 그런 다음 실행이 중지되면 해당 변수를 검사 할 수 있습니다.

다른 방법으로 로그 수준을 높이면 더 많은 정보를 얻을 수 있습니다.

+0

. marshaller.marshal 내에서 예외가 발생하고 결함 요소 이름을 출력하지 않습니다. 또한 디버깅 수준으로 로그 설정을 향상 시키면 마샬 러 코드가 디버그 로그를 출력하지 않는 것처럼 작동하지 않습니다. – user193116

+0

내가 말한 것은 디버깅하는 동안 마샬링 (marshal) 방법을 사용하는 것입니다. 그렇게하려면 소스 코드가 프로젝트에 추가되어야합니다. [예] (http://www.avajava.com/tutorials/lessons/how-do-i-view-and-debug-jdk-source-code-in-eclipse.html?page=1) – SantoshK

0

Eclipse IDE를 사용하면 Sun의 JAXB 구현과 같은 일부 타사 코드를 디버깅 할 수 있습니다.

이클립스에서,이 두 블록을 시도 :

를 제 3 자 디버그 지원을

Search for class AttributeProperty inside your classpath entry for JRE System Library 
In Outline tab, expand class file and respective class inside this 
Right-Click on target method (in this case: AttributeProperty.getIdValue) 
Click on: Toggle Method Breakpoint 

확인을 사용하는 필드 문제입니다

  1. 사용 디버그 탭과 변수 탭
  2. 다른 디버그 프로세스와 마찬가지로 디버그 모드로 테스트를 시작하십시오.
  3. 프로그램이 관련 중단 점을 달성하면 변수 탭 'this'및 'arg0'참조를 확인하십시오. 이 참조에는 현재 노드와 mashalled 객체에 대한 정보가 포함됩니다.

이 시점에서 컨텍스트를 분석하고 디버깅 할 준비가되었습니다.

동일한 JAXB/IDREF 문제를 다루고 있으며 아직 해결 방법이 없습니다. 나는 그것을 조사하고있다.

이 문제를 해결 했습니까?

최고 감사합니다,

그리고 작동하지 않았다 과거