4
votes

I m using jaxb moxy to unmarshal a xml from binder but it gives exception:A descriptor with default root element beans was not found in the project. im also using package-info.java to specify namespace.

Xml file to unmarshal-

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.example.org/package">
</beans>

Beans.java-

@XmlRootElement(namespace="http://www.example.org/package")
public class Beans {

String name = "ss";

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

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

}

package-info.java

@XmlSchema(
    namespace="http://www.example.org/package",
    elementFormDefault=XmlNsForm.QUALIFIED)
package com.jaxb.test;


import javax.xml.bind.annotation.*;

Main class-

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        File xml = new File(
                "D:\\eclipse-jee-indigo-SR2\beans.xml");
        Document document = db.parse(xml);

        JAXBContext jc = JAXBContext.newInstance(Beans.class);



        Binder<Node> binder = jc.createBinder();

        Beans customer = (Beans)   jc.createBinder().unmarshal(document);//throws exception

     //Beans customer = (Beans) jc.createUnmarshaller().unmarshal(xml);This works
    //Beans customer = (Beans) jc.createUnmarshaller().unmarshal(document);Throws same exception

Exception-

javax.xml.bind.UnmarshalException
- with linked exception:
[Exception [EclipseLink-25008] (Eclipse Persistence Services - 2.4.1.v20121003-   ad44345): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: A descriptor with default root element beans was not found in the project]
at  org.eclipse.persistence.jaxb.JAXBUnmarshaller.handleXMLMarshalException(JAXBUnmarshaller.java:1014)
at  org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:199)
at com.jaxb.test.JaxbTest.main(JaxbTest.java:43)
2

2 Answers

1
votes

By default a DocumentBuilderFactory is not namespace aware. This means the document you are passing to MOXy will not be namespace qualified as expected. You can fix this by adding the following to your code:

dbf.setNamespaceAware(true);
1
votes

Solved It.Instead of using a package-info.java i used bindins.xml .

beans-bindings.xml-

<?xml version="1.0" encoding="UTF-8"?>
<xml-schema element-form-default="QUALIFIED" namespace="http://www.example.org/package">
    <xml-ns prefix="" namespace-uri="http://www.example.org/package" />
</xml-schema>

<java-types>
    <java-type name="Beans">
    <xml-root-element name="beans"/>
        <java-attributes>

        </java-attributes>
    </java-type>
</java-types>