Kuldeep Singh
Kuldeep Singh

Reputation: 208

Issue with jaxb moxy when using binder to unmarshal xml with namespace

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)

Upvotes: 4

Views: 2146

Answers (2)

Kuldeep Singh
Kuldeep Singh

Reputation: 208

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>

Upvotes: 1

bdoughan
bdoughan

Reputation: 149037

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

Upvotes: 1

Related Questions