1

入力:

<?xml version="1.0" encoding="UTF-8"?>
<foo:root xmlns:foo="http://www.domain.org/foo" 
      xmlns="http://www.domain.org/foo"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <a xsi:type="foo:someType">
   <b  text="some text" />
  </a>
</foo:root>

バインディング:

<?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-element java-attribute="contentRoot" xml-path="." type="test.ContentRoot" />
        </java-attributes>
    </java-type>

    <java-type name="ContentRoot">
        <java-attributes>
            <xml-element java-attribute="text" xml-path="a/b/@text" />
            <xml-element java-attribute="contents" xml-path="a/b" type="test.Content" container-type="java.util.List" />
        </java-attributes>
    </java-type>

    <java-type name="Content">
        <java-attributes>
            <xml-element java-attribute="text" xml-path="@text" />
        </java-attributes>
    </java-type>
</java-types>

</xml-bindings>

パッケージ テストのクラス:

public class Root {
 private List<ContentRoot> contentRoots = new LinkedList<ContentRoot>();
 public List<ContentRoot> getContentRoots() {
    return contentRoots;
 } 
 public void setContentRoots(List<ContentRoot> contentRoots) {
    this.contentRoots = contentRoots;
 }
 public void setContentRoot(ContentRoot contentRoot) {
    this.contentRoots.add(contentRoot);
 }
}

public class ContentRoot {
 private List<Content> contents;
 private String text;
 public List<Content> getContents() {
    return contents;
 }
 public void setContents(List<Content> contents) {
    this.contents = contents;
 }
 public String getText() {
    return text;
 }
 public void setText(String text) {
    this.text = text;
 }  
}

public class Content  {
 private String text;
 public String getText() {
    return text;
 }
 public void setText(String text) {
    this.text = text;
 }
}

実行中のコード:

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"));
System.out.println(root.getContentRoots().get(0).getText());    
System.out.println(root.getContentRoots().get(0).getContents().get(0).getText());

その結果、テキストは ContentRoot に設定されますが、Content には設定されません (最後の System.out.println() から NullPointerException が発生します)。誰かが理由を教えてもらえますか?

4

1 に答える 1