1

I have an xsd. In xsd there is a canvas which contains lot of widgets, rows & columns. canvas could be a widget. So inside canvas many widget and canvas exist. My xsd is::::

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

Now i have written code for marshalling. In this code i have taken two widgets inside root canvas and it is generating xml properly.

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

But when i takes 1 widget and 1 canvas inside root canvas its giving error. Below is my code

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

And error is:

javax.xml.bind.MarshalException - with linked exception: [com.sun.istack.internal.SAXException2: Instance of "com.til.canvasmaker.xsddto.Canvas" is substituting "com.til.canvasmaker.xsddto.WidgetEntry", but "com.til.canvasmaker.xsddto.Canvas" is bound to an anonymous type.] at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:317) at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:243) at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75) at Main.main(Main.java:56) Caused by: com.sun.istack.internal.SAXException2: Instance of "com.til.canvasmaker.xsddto.Canvas" is substituting "com.til.canvasmaker.xsddto.WidgetEntry", but "com.til.canvasmaker.xsddto.Canvas" is bound to an anonymous type. at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:216) at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:631) at com.sun.xml.internal.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:54) at com.sun.xml.internal.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:157) at com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:141) at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:306) at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:561) at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:290) at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:462) at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:314) ... 3 more

gariepy
  • 3,576
  • 6
  • 21
  • 34
Deepak
  • 143
  • 1
  • 13
  • possible duplicate of [java, xsd & marshalling: jre bug, my fault or xsd issues?](http://stackoverflow.com/questions/21387170/java-xsd-marshalling-jre-bug-my-fault-or-xsd-issues) – bdoughan Apr 27 '14 at 10:14

0 Answers0