Ayon
Ayon

Reputation: 315

JAXB umarshall exception

I am new to Jaxb and having problem parsing a simple XML. The XML in question is shown below:

<tables>
    <table id="1" >
    <schema>validator_test</schema>
        <name>test1</name>
        <rowCountToValidate>6</rowCountToValidate>
        <columnTypeCheckRequired>FALSE</columnTypeCheckRequired>
        <additionalColumns>column1,column2</additionalColumns>
    </table>
    <table id="2">
    <schema>validator_test</schema>
        <name>validate_external1</name>
        <rowCountToValidate>2</rowCountToValidate>
        <columnTypeCheckRequired>FALSE</columnTypeCheckRequired>
        <additionalColumns>column1,column2</additionalColumns>
    </table>
    <table id="3">
    <schema>validator_test</schema>
        <name>Test_View1</name>
        <rowCountToValidate>2</rowCountToValidate>
        <columnTypeCheckRequired>FALSE</columnTypeCheckRequired>
        <additionalColumns>column1,column2</additionalColumns>
    </table>
</tables>

The Jaxb class to unmarshall this is:-

@XmlRootElement(name = "table")
@XmlType(propOrder = { "name", "schema", "rowCountToValidate","columnTypeCheckRequired","additionalColumns","targetName"})
@Service
public class TableInfo {

    private static final boolean TRUE = true;
    @Value("${default.row.count.to.validate}")
    private Integer defaultRowCountToValidate;

    /**
     *
     */
    public TableInfo() {
    }

    private String name;
    private String schema;
    private Integer rowCountToValidate;
    private String targetName;
    private String columnTypeCheckRequired;
    private String additionalColumns;

    @XmlElement(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlElement(name = "schema")
    public String getSchema() {
        return schema;
    }

    public void setSchema(String schema) {
        this.schema = schema;
    }

    @XmlElement(name = "rowCountToValidate")
    public Integer getRowCountToValidate() {
        return rowCountToValidate;
    }

      @XmlElement(name = "columnTypeCheckRequired")
      public String getColumnTypeCheckRequired() {
        return columnTypeCheckRequired;
      }

    public void setColumnTypeCheckRequired(String columnTypeCheckRequired) {
        this.columnTypeCheckRequired = columnTypeCheckRequired;
    }


     @XmlElement(name = "additionalColumns")
      public String getAdditionalColumns() {
        return additionalColumns;
      }

    public void setAdditionalColumns(String additionalColumns) {
        this.additionalColumns = additionalColumns;
    }


    public void setRowCountToValidate(Integer rowCountToValidate) {
        // If user configured value is not null and greater than zero then set
        // the value otherwise use default value
        if ((null != rowCountToValidate) && (rowCountToValidate.intValue() > 0)) {
            this.rowCountToValidate = rowCountToValidate;
        }else {
            this.rowCountToValidate = defaultRowCountToValidate;
        }
    }

    @XmlElement(name = "targetName")
    public String getTargetName() {
        return targetName;
    }

    public void setTargetName(String targetName) {
        this.targetName = targetName;
    }


    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this);
    }
}

However, I am ggetting the following exception:-

`JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"tables"). Expected elements are <{tables}table>`

I would really appreciate if someone can point out the error I am doing. I am new to this and am not really able to understand how jaxb works.

Upvotes: 0

Views: 85

Answers (3)

mayank agrawal
mayank agrawal

Reputation: 658

 @XmlRootElement(name = "table")
 <tables>
 <table id="1" >

Below are the 2 solution for above issue:

  1. You need to generate the classes using XSD.
  2. You need to generate the classes as per your required XML: in XML table is inside the tables so tables should be the root element.

And table should be in the form of list in tables class.

Upvotes: 1

Abhilash Arjaria
Abhilash Arjaria

Reputation: 142

in your code root element is @XmlRootElement(name = "table") where in your XML file it is "tables"

Suggest you to use xjc command to build java POJO classes automatically

xjc -d -p sample.xsd -d to define where the generated classes shall be stored in the file system, -p to define the package to be used

Upvotes: 0

Aleksandr Podkutin
Aleksandr Podkutin

Reputation: 2580

You need to create class Tables with @XmlRootElement(name = "tables") and that class must contain table field with type TableInfo.

When you unmarshal example xml, you need to pass Tables class to unmarshaller.

Upvotes: 1

Related Questions