[英]Marshal not @XmlRootElement with JAXB to String
I need to marshal one JAXB
generated object to String
. 我需要将一个
JAXB
生成的对象JAXB
送到String
。 The problem is that it does not have an @XmlRootElement
annotation. 问题是它没有
@XmlRootElement
注释。 It is not a root element. 它不是根元素。 The element in
XSD
looks like this: 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
prefix points to this name space: x mlns:tns="http://www.cubiksonline.com/2009/08/AssessmentProvider"
tns
前缀指向此名称空间:x mlns:tns="http://www.cubiksonline.com/2009/08/AssessmentProvider"
I found out that I can do this to marshal not XML
root elements with JAXB
: 我发现我可以用
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);
}
}
I am initializing my JAXB
context like this: 我正在初始化我的
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;
}
}
This package: com.cubiksonline._2009._08.assessmentprovider
is the package where there are all JAXB
generated classes including and CompletedAssessmentInstance
. 这个包:
com.cubiksonline._2009._08.assessmentprovider
是包含所有JAXB
生成的类的包,包括和CompletedAssessmentInstance
。 The problem is when the marshaller.marshal(rootElement, writer);
问题是当
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? 有谁知道问题可能在哪里?
I found a workaround for this issue. 我找到了解决此问题的方法。 I had to create
JAXBContext
for the specific class like this: 我必须为特定的类创建
JAXBContext
,如下所示:
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. 我使用
cxf-codegen-plugin:2.6.0
从WSDL
文件生成类,我注意到如果我将版本更改为cxf-codegen-plugin:2.4.2
使用类加载器一切正常。 If I will find the problem I will post the solution here. 如果我发现问题,我会在这里发布解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.