2012-09-20 1 views
3

생성 된 객체 을 String으로 마샬링해야합니다. 문제는 @XmlRootElement 주석이 없다는 것입니다. 그것은 루트 요소가 아닙니다. XSD의 요소는 다음과 같습니다문자열에 JAXB가있는 @XmlRootElement가 아닌 마샬링

<xs:complexType name="CompletedAssessmentInstance"> 
    <xs:complexContent mixed="false"> 
     <xs:extension base="tns:AssessmentInstance"> 
     <xs:sequence> 
      <xs:element minOccurs="0" name="CompletionDate" type="xs:dateTime"/> 
      <xs:element minOccurs="0" name="CustomResultsXML" nillable="true" type="xs:string"/> 
      <xs:element minOccurs="0" name="NormedScores" nillable="true" type="tns:NormedScores"/> 
      <xs:element minOccurs="0" name="RawScore" type="xs:decimal"/> 
      <xs:element minOccurs="0" name="TimeTaken" type="xs:int"/> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 
    <xs:element name="CompletedAssessmentInstance" nillable="true" type="tns:CompletedAssessmentInstance"/> 

tns 접두사 점을이 이름 공간 :

public static String completedAssessmentInstanceToString(CompletedAssessmentInstance assessmentInstance) 
     throws AssessmentException { 
    try { 
     Marshaller marshaller = jc.createMarshaller(); 

     StringWriter writer = new StringWriter(); 

     QName qname = new QName(
       "http://www.cubiksonline.com/2009/08/AssessmentProvider", 
       "CompletedAssessmentInstance"); 

     JAXBElement<CompletedAssessmentInstance> rootElement = new JAXBElement<CompletedAssessmentInstance>(
       qname, 
       CompletedAssessmentInstance.class, 
       assessmentInstance); 

     marshaller.marshal(rootElement, writer); 

     return writer.toString(); 
    } catch (JAXBException ex) { 
     LOGGER.error("JAXB Exception occurred.", ex); 
     throw new AssessmentException(RequestStatusValue.InvalidProjectConfiguration, 
       "Unable to marshal the CompletedAssessmentInstance data: " + assessmentInstance, ex); 
    } 
} 
: 나는 JAXB하지 XML 루트 요소를 마샬링하는이 작업을 수행 할 수 있다는 것을 알게 X mlns:tns="http://www.cubiksonline.com/2009/08/AssessmentProvider"

JAXB 컨텍스트를 초기화하는 중입니다.

private static JAXBContext jc = createJaxbContext(); 

private static JAXBContext createJaxbContext() { 
    try { 
     ClassLoader cl = com.cubiksonline._2009._08.assessmentprovider.ObjectFactory.class.getClassLoader(); 
     return JAXBContext.newInstance("com.cubiksonline._2009._08.assessmentprovider", cl); 
    } catch (JAXBException ex) { 
     LOGGER.error("Failed to create JAXB context: ", ex); 
     return null; 
    } 
} 

이 패키지는 com.cubiksonline._2009._08.assessmentprovider이며 CompletedAssessmentInstance을 포함한 JAXB 생성 클래스가있는 패키지입니다.

가 가 가

사람이 어디에 문제가 수도 알고 있나요

Caused by: javax.xml.bind.MarshalException 
- with linked exception: 
[javax.xml.bind.JAXBException: com.cubiksonline._2009._08.assessmentprovider.CompletedAssessmentInstance is not known to this context] 
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:318) 
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:244) 
    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:95) 
    at com.groupgti.esb.assessments.cubiks.CubiksFactory.completedAssessmentInstanceToString(CubiksFactory.java:272)[647:com.groupgti.esb.online.tests.cubiks:1.2.0.SNAPSHOT] 
    ... 40 more 
Caused by: javax.xml.bind.JAXBException: com.cubiksonline._2009._08.assessmentprovider.CompletedAssessmentInstance is not known to this context 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:246) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:261) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:144) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:189) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:316) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:323) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:72) 
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494) 
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:315) 
    ... 43 more 
Caused by: javax.xml.bind.JAXBException: com.cubiksonline._2009._08.assessmentprovider.CompletedAssessmentInstance is not known to this context 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:625) 
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:141) 
    ... 49 more 
: 문제는 marshaller.marshal(rootElement, writer); 나는 다음과 같은 예외가 호출 될 때입니까?

+0

JAXB RI를 사용하고 있으므로,'JAXBContext' 구현시'toString()'은 모든 매핑 된 클래스를 출력 할 것입니다. com.cubiksonline._2009._08.assessmentprovider.CompletedAssessmentInstance'가 포함되어 있는지 확인해 주시겠습니까? 또한 JAXB는 스펙 (JSR-222)이므로 EclipseLink MOXy (MOXy 리드)와 같은 다른 구현을 시도하여 JAXB RI의 버그인지 확인할 수도 있습니다. –

+0

JAXBContext에서 toString을 수행하면 9 개의 클래스 만 나열되므로이 패키지에는 약 50 개의 클래스가 있으며이 클래스 com.cubiksonline._2009._08.assessmentprovider.CompletedAssessmentInstance는 포함되어 있지 않으므로 이상합니다. 이미 해결책을 찾았습니다. 다음과 같이 JAXB 컨텍스트를 초기화해야했습니다. JAXBContext.newInstance (CompletedAssessmentInstance.class) 그래도 JAXB가 지정된 패키지의 모든 클래스를로드하지 않는 이유를 이해할 수 없습니다. –

+0

JAXB RI에서 버그를 발견했을 수 있습니다. JAXB (JSR-222)의 새 버전이나 대체 구현을 시도하여 확인할 수 있습니다. –

답변

2

이 문제의 해결 방법을 발견했습니다. 이 같은 특정 클래스에 대한 JAXBContext을 만들 수 있었다 :

private static JAXBContext createJaxbContext() { 
    try { 
     return JAXBContext.newInstance(CompletedAssessmentInstance.class); 
    } catch (JAXBException ex) { 
     LOGGER.error("Failed to create JAXB context: ", ex); 
     return null; 
    } 
} 

이 문제가 해결되지 않습니다, 그냥 해결 방법입니다. 내가 파일에서 생성 된 클래스에 cxf-codegen-plugin:2.6.0을 사용하고 있었는데, 내가 깨달은 점은 버전을 cxf-codegen-plugin:2.4.2으로 변경하면 모든 것이 클래스 로더를 사용하여 잘 작동한다는 것입니다. 문제를 발견하면 여기에 해결책을 게시 할 것입니다.