Marshal不是@XmlRootElement,JAXB为String(Marshal not @XmlRootElement with JAXB to String)

编程入门 行业动态 更新时间:2024-10-24 06:38:25
Marshal不是@XmlRootElement,JAXB为String(Marshal not @XmlRootElement with JAXB to String)

我需要将一个JAXB生成的对象JAXB送到String 。 问题是它没有@XmlRootElement注释。 它不是根元素。 XSD的元素如下所示:

<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前缀指向此名称空间:x mlns:tns="http://www.cubiksonline.com/2009/08/AssessmentProvider"

我发现我可以用JAXB来编组XML根元素:

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上下文,如下所示:

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是包含所有JAXB生成的类的包,包括和CompletedAssessmentInstance 。 问题是当marshaller.marshal(rootElement, writer); 被调用我得到以下异常:

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

有谁知道问题出在哪里?

I need to marshal one JAXB generated object to String. The problem is that it does not have an @XmlRootElement annotation. It is not a root element. The element in XSD looks like this:

<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 prefix points to this name space: xmlns:tns="http://www.cubiksonline.com/2009/08/AssessmentProvider"

I found out that I can do this to marshal not XML root elements with JAXB:

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); } }

I am initializing my JAXB context like this:

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; } }

This package: com.cubiksonline._2009._08.assessmentprovider is the package where there are all JAXB generated classes including and CompletedAssessmentInstance. The problem is when the marshaller.marshal(rootElement, writer); is invoked I get the following exception:

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

Does anyone know where might the problem?

最满意答案

我找到了解决此问题的方法。 我必须为特定的类创建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从WSDL文件生成类,我注意到如果我将版本更改为cxf-codegen-plugin:2.4.2使用类加载器一切正常。 如果我发现问题,我会在这里发布解决方案。

I found a workaround for this issue. I had to create JAXBContext for the specific class like this:

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

This does not solves the problem, it's just workaround. I was using cxf-codegen-plugin:2.6.0 to generated classes from WSDL file, what I noticed was that if I change the version to cxf-codegen-plugin:2.4.2 everything works just fine using the class loader. If I will find the problem I will post the solution here.

更多推荐

本文发布于:2023-08-04 08:13:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1413145.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:XmlRootElement   Marshal   String   JAXB

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!