2013-08-01 2 views
2

J'utilise la même configuration de liaisons pour unmarshalling une fois en utilisant le Unmarshaler et une fois en utilisant un classeur. La première approche fonctionne bien, la seconde jette une exception. Quelle est la raison?EclipseLink MOXy: Liaisons fonctionnant avec Unmarshaller mais pas avec Binder

entrée:

<?xml version="1.0" encoding="UTF-8"?> 
<foo:root xmlns:foo="http://www.domain.org/foo">test</foo:root> 

Fixations:

<?xml version="1.0"?> 
<xml-bindings 
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
package-name="test"> 

<xml-schema element-form-default="QUALIFIED" namespace="http://www.domain.org/foo"> 
    <xml-ns prefix="foo" namespace-uri="http://www.domain.org/foo" /> 
</xml-schema> 

<java-types>   
    <java-type name="Root"> 
    <xml-root-element name="root"/> 
    <java-attributes> 
     <xml-value java-attribute="text"/> 
    </java-attributes> 
    </java-type> 
</java-types> 

</xml-bindings> 

Classes:

package test; 

public class Root { 

private String text; 

public String getText() { 
    return text; 
} 

public void setText(String text) { 
    this.text = text; 
} 
} 

Démo:

Map<String, Object> jaxbContextProperties = new HashMap<String, Object>(1); 
jaxbContextProperties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "bindings.xml"); 
JAXBContext jaxbContext = JAXBContextFactory.createContext(new Class[] { Root.class}, jaxbContextProperties); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
Root root = (Root)unmarshaller.unmarshal(new File("input.xml")); 

DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document document = documentBuilder.parse(new File("input.xml")); 
Binder<Node> binder = jaxbContext.createBinder(); 
root = (Root) binder.unmarshal(document); 

Sortie:

Exception in thread "main" javax.xml.bind.UnmarshalException - with linked exception: 
[Exception [EclipseLink-25008] (Eclipse Persistence Services - 2.5.0.v20130507- 3faac2b): org.eclipse.persistence.exceptions.XMLMarshalException 
Exception Description: A descriptor with default root element foo:root was not found in the project] 

Répondre

2

Il n'y a pas de problème avec vous EclipseLink JAXB (MOXy) avez juste besoin de vous assurer que votre DocumentBuilderFactory est namespace au courant en changeant votre code pour ressembler à ce qui suit:

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
documentBuilderFactory.setNamespaceAware(true); 
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); 
Document document = documentBuilder.parse(new File("input.xml")); 
Questions connexes