将Java编组为Xml时出错
我有一个xsd。在xsd中有一个画布,其中包含许多小部件、行和列。画布可以是一个小部件。所以在画布中存在许多小部件和画布。我的xsd是:将Java编组为Xml时出错,java,xml,jaxb,marshalling,Java,Xml,Jaxb,Marshalling,我有一个xsd。在xsd中有一个画布,其中包含许多小部件、行和列。画布可以是一个小部件。所以在画布中存在许多小部件和画布。我的xsd是: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.cms.indiatimes.com/Canvas" xmlns:tns="http://www.cms.indiatimes.com/Canvas" elementFormDefaul
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.cms.indiatimes.com/Canvas" xmlns:tns="http://www.cms.indiatimes.com/Canvas"
elementFormDefault="qualified">
<xsd:element name="canvas">
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="tns:widgetEntry">
<xsd:sequence>
<xsd:element name="widget" type="tns:widgetEntry"
minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="row" type="xsd:integer" minOccurs="1"
maxOccurs="1" />
<xsd:element name="column" type="xsd:integer"
minOccurs="1" maxOccurs="1" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="widgetEntry">
<xsd:sequence>
<xsd:element name="ID" type="xsd:int" minOccurs="1"
maxOccurs="1" />
<xsd:element name="templateName" type="xsd:string"
minOccurs="0" maxOccurs="1" />
<xsd:element name="cacheTime" type="xsd:integer"
minOccurs="1" maxOccurs="1" />
<xsd:element name="parameter" type="tns:parameter"
minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="visible" type="xsd:boolean" default="false" />
<xsd:element name="canvasSet" type="xsd:boolean" default="false">
<xsd:annotation>
<xsd:documentation xml:lang="en">
indicates if the
widget is also a canvas.
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="position" type="tns:position"
minOccurs="0" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="parameter">
<xsd:annotation>
<xsd:documentation xml:lang="en">
The parameter contains
a name, a type and a
value.Based upon type, the
value will need to be
converted into the java type.
</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="parameterName" type="xsd:string"
minOccurs="1" maxOccurs="1" />
<xsd:element name="parameterType">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="number" />
<xsd:enumeration value="string" />
<xsd:enumeration value="date" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="parameterValue" type="xsd:string"
minOccurs="1" maxOccurs="1" />
<xsd:element name="minParameterValue" type="xsd:string"
minOccurs="0" maxOccurs="1" />
<xsd:element name="maxParameterValue" type="xsd:string"
minOccurs="0" maxOccurs="1" />
<xsd:element name="defaultParameterValue" type="xsd:string"
minOccurs="0" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="position">
<xsd:sequence>
<xsd:element name="leftTopCornerRowValue" type="xsd:int"
minOccurs="1" maxOccurs="1" />
<xsd:element name="leftTopCornerColumnValue" type="xsd:int"
minOccurs="1" maxOccurs="1" />
<xsd:element name="leftBottomCornerRowValue" type="xsd:int"
minOccurs="1" maxOccurs="1" />
<xsd:element name="leftBottomCornerColumnValue" type="xsd:int"
minOccurs="1" maxOccurs="1" />
<xsd:element name="rightTopCornerRowValue" type="xsd:int"
minOccurs="1" maxOccurs="1" />
<xsd:element name="rightTopCornerColumnValue" type="xsd:int"
minOccurs="1" maxOccurs="1" />
<xsd:element name="rightBottomCornerRowValue" type="xsd:int"
minOccurs="1" maxOccurs="1" />
<xsd:element name="rightBottomCornerColumnValue" type="xsd:int"
minOccurs="1" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
指示
小部件也是画布。
该参数包含
名称、类型和名称
值。根据类型
价值将需要
转换为java类型。
现在我已经编写了编组代码。在这段代码中,我在根画布中使用了两个小部件,它正确地生成了xml
public class Main {
public static void main(String[] args) {
Canvas canvas = new Canvas();
canvas.setColumn(new BigInteger("2"));
canvas.setRow(new BigInteger("2"));
List<WidgetEntry> listEntry = canvas.getWidget();
WidgetEntry widget1 = new WidgetEntry();
widget1.setID(1);
widget1.setCacheTime(new BigInteger("5"));
widget1.setCanvasSet(false);
widget1.setTemplateName("Header");
widget1.setVisible(true);
List<Parameter> paramList = widget1.getParameter();
Parameter param = new Parameter();
param.setParameterName("City");
param.setParameterValue("from URL");
param.setParameterType("Number");
paramList.add(param);
listEntry.add(widget1);
WidgetEntry widget2 = new WidgetEntry();
widget2.setID(1);
widget2.setCacheTime(new BigInteger("5"));
widget2.setCanvasSet(false);
widget2.setTemplateName("Menu");
widget2.setCanvasSet(true);
widget2.setVisible(true);
listEntry.add(widget2);
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Canvas.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
// output pretty printed
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(canvas, System.out);
} catch (PropertyException e) {
e.printStackTrace();
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
公共类主{
公共静态void main(字符串[]args){
画布=新画布();
setColumn(新的BigInteger(“2”));
canvas.setRow(新的BigInteger(“2”));
List listEntry=canvas.getWidget();
WidgetEntry widget1=新的WidgetEntry();
widget1.setID(1);
setCacheTime(新的BigInteger(“5”));
widget1.setCanvasSet(false);
widget1.setTemplateName(“标题”);
widget1.setVisible(true);
List paramList=widget1.getParameter();
参数param=新参数();
参数setParameterName(“城市”);
参数setParameterValue(“来自URL”);
参数setParameterType(“编号”);
paramList.add(param);
添加(widget1);
WidgetEntry widget2=新的WidgetEntry();
widget2.setID(1);
setCacheTime(新的BigInteger(“5”));
widget2.setCanvasSet(false);
widget2.setTemplateName(“菜单”);
widget2.setCanvasSet(true);
widget2.setVisible(true);
添加(widget2);
试一试{
JAXBContext JAXBContext=JAXBContext.newInstance(Canvas.class);
Marshaller jaxbMarshaller=jaxbContext.createMarshaller();
//输出精美印刷品
setProperty(Marshaller.JAXB_格式化的_输出,true);
jaxbMarshaller.marshall(canvas,System.out);
}捕获(属性异常e){
e、 printStackTrace();
}捕获(JAXBEException e){
e、 printStackTrace();
}
}
}
但当我在根画布中取1个小部件和1个画布时,它的给出错误。下面是我的代码
public class Main {
public static void main(String[] args) {
Canvas canvas = new Canvas();
canvas.setColumn(new BigInteger("2"));
canvas.setRow(new BigInteger("2"));
List<WidgetEntry> listEntry = canvas.getWidget();
WidgetEntry widget1 = new WidgetEntry();
widget1.setID(1);
widget1.setCacheTime(new BigInteger("5"));
widget1.setCanvasSet(false);
widget1.setTemplateName("Header");
widget1.setVisible(true);
List<Parameter> paramList = widget1.getParameter();
Parameter param = new Parameter();
param.setParameterName("City");
param.setParameterValue("from URL");
param.setParameterType("Number");
paramList.add(param);
listEntry.add(widget1);
Canvas canvas1 = new Canvas();
canvas1.setColumn(new BigInteger("2"));
canvas1.setRow(new BigInteger("2"));
canvas1.setID(1);
canvas1.setCacheTime(new BigInteger("5"));
canvas1.setCanvasSet(false);
canvas1.setTemplateName("Menu");
canvas1.setCanvasSet(true);
canvas1.setVisible(true);
listEntry.add(canvas1);
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Canvas.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
// output pretty printed
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(canvas, System.out);
} catch (PropertyException e) {
e.printStackTrace();
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
公共类主{
公共静态void main(字符串[]args){
画布=新画布();
setColumn(新的BigInteger(“2”));
canvas.setRow(新的BigInteger(“2”));
List listEntry=canvas.getWidget();
WidgetEntry widget1=新的WidgetEntry();
widget1.setID(1);
setCacheTime(新的BigInteger(“5”));
widget1.setCanvasSet(false);
widget1.setTemplateName(“标题”);
widget1.setVisible(true);
List paramList=widget1.getParameter();
参数param=新参数();
参数setParameterName(“城市”);
参数setParameterValue(“来自URL”);
参数setParameterType(“编号”);
paramList.add(param);
添加(widget1);
Canvas canvas1=新画布();
canvas1.setColumn(新的BigInteger(“2”));
canvas1.setRow(新的BigInteger(“2”));
canvas1.setID(1);
canvas1.setCacheTime(新的BigInteger(“5”));
canvas1.setCanvasSet(false);
canvas1.setTemplateName(“菜单”);
canvas1.setCanvasSet(true);
canvas1.setVisible(true);
添加(canvas1);
试一试{
JAXBContext JAXBContext=JAXBContext.newInstance(Canvas.class);
Marshaller jaxbMarshaller=jaxbContext.createMarshaller();
//输出精美印刷品
setProperty(Marshaller.JAXB_格式化的_输出,true);
jaxbMarshaller.marshall(canvas,System.out);
}捕获(属性异常e){
e、 printStackTrace();
}捕获(JAXBEException e){
e、 printStackTrace();
}
}
}
错误是:
javax.xml.bind.MarshalException
-除此之外:
[com.sun.istack.internal.SAXException2:“com.til.canvasmaker.xsddto.Canvas”的实例正在替换“com.til.canvasmaker.xsddto.WidgetEntry”,但“com.til.canvasmaker.xsddto.Canvas”绑定到匿名类型。]
位于com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:317)
位于com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshall(MarshallerImpl.java:243)
位于javax.xml.bind.helpers.AbstractMarshallerImpl.marshall(AbstractMarshallerImpl.java:75)
Main.Main(Main.java:56)
原因:com.sun.istack.internal.SAXException2:“com.til.canvasmaker.xsddto.Canvas”的实例正在替换“com.til.canvasmaker.xsddto.WidgetEntry”,但“com.til.canvasmaker.xsddto.Canvas”绑定到匿名类型。
位于com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:216)
位于com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:631)
位于com.sun.xml.internal.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:54)
位于com.sun.xml.internal.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:157)
位于com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:141)
位于com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:306)
位于com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAssociatent(XMLSerializer.java:561)
位于com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:290)
请访问com.sun.xml.internal。