Java 我得到的错误是;缺少@XmlRootElement注释";在尝试使用JAXB将对象打包成xml文件时
我是一个刚刚开始使用JAXB的人,我所需要的只是将一个对象写入xml,然后在某个时候将其读回java 这是我的班级:Java 我得到的错误是;缺少@XmlRootElement注释";在尝试使用JAXB将对象打包成xml文件时,java,jaxb,xml-serialization,Java,Jaxb,Xml Serialization,我是一个刚刚开始使用JAXB的人,我所需要的只是将一个对象写入xml,然后在某个时候将其读回java 这是我的班级: public class VSM implements java.io.Externalizable { ArrayList<String> termList; //Term Dictionary ArrayList<String> queryTermList; /
public class VSM implements java.io.Externalizable
{
ArrayList<String> termList; //Term Dictionary
ArrayList<String> queryTermList; //Query list
ArrayList<ArrayList<Doc>> docLists;
ArrayList<ArrayList<Doc>> queryDocLists;
double[] docLength; //Denominator for doc linearization
double queryLength; //Denominator for query lineriazation
HashMap<String, Double> queryDocLenght; //Vector for holding noramiliase queries
HashMap<String, Double> queryDoc;
String Docs[]; //List of file names
Double scoreCap=0.04; //Score cap to reduce the effect of stop words
public static String fileName = "indexedFiles.txt";
private static final long serialVersionUID = 7863262235394607247L;
public VSM()
{
//Some constructor code
}
}
我还不完全理解JABX和所有的it方法,所以我很难理解这个错误,我试着用谷歌搜索了一下,发现很多人都犯了这个错误,但是仍然很难理解这里的问题和解决方案。当您的类没有使用
@XmlRootElement
注释时,您需要将其包装到JAXBElement
的实例中,就像您对封送
操作之一所做的那样:
jaxbMarshaller.marshal(new JAXBElement<VSM>(new QName("uri","local"), VSM.class, vsm), System.out);
更新
谢谢你的回答,这样做只会让我创建空的xml文件,但是 现在我知道我做错了什么,我试图写作是愚蠢的 不指定注释的xml
实现不需要任何注释(请参阅)。添加的最常见注释是
@XmlRootElement
,但如果没有它,您可以使用JAXBElement
(请参阅:)。如果您的类没有公共访问器方法,那么您可能还对@xmlacessortype(xmlacesstype.FIELD)
注释感兴趣(请参阅:)。感谢您的回答,这样做只会让我创建空xml文件,但现在我知道我做错了什么,我试图编写一个xml而不指定annoations@Snedden27-我已经用一些额外的信息更新了我的答案,这些信息应该会有所帮助。非常感谢,我在JAX-RPC中使用了这些信息,效果非常好!
javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.SAXException2: unable to marshal type "KPT.VSM" as an element because it is missing an @XmlRootElement annotation]
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:326)
at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:251)
at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(Unknown Source)
at KPT.VSM.writeXML(VSM.java:477)
at KPT.VSM.main(VSM.java:511)
Caused by: com.sun.istack.SAXException2: unable to marshal type "KPT.VSM" as an element because it is missing an @XmlRootElement annotation
at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:249)
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:339)
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494)
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:323)
... 4 more
jaxbMarshaller.marshal(new JAXBElement<VSM>(new QName("uri","local"), VSM.class, vsm), System.out);
jaxbMarshaller.marshal(vsm, System.out);