JAXB Moxy-关于如何注释xsd复杂类型的字段的问题

时间:2011-08-12 16:38:18

标签: annotations jaxb moxy complextype

我开始使用JaxB并使用Moxy实现。我有一个行业标准xsd,我使用Jaxb转换为Java对象模型。我已经注释了简单的字段,如字符串,整数和日期。

我一直在寻找并需要指向正确的方向来注释以下字段,这是一个xsd复杂类型,它有4个属性和一个可选的字符串元素。生成的代码的子集如下:

Conditions.java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "condition"
})
@XmlRootElement(name = "conditions")
public class Conditions {
protected List<Conditions.Condition> condition;

public List<Conditions.Condition> getCondition() {
    if (condition == null) {
        condition = new ArrayList<Conditions.Condition>();
    }
    return this.condition;
}

@XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = {
            "problemDate",
            "problemType",
            "problemCode",
            "problemStatus",         
    })
    public static class Condition {

        protected IvlTs problemDate;
        //This is the field I need to annotate (problemType)
        protected Cd problemType;
        //The 2 below fields (problemCode, problemStatus) will also have to be annotated but I am just focusing on problemType for now
        protected Cd problemCode;
        protected Ce problemStatus

 public void setProblemDate(IvlTs value) {
            this.problemDate = value;
        }

 public void setProblemType(Cd value) {
            this.problemType = value;
        }
public void setProblemCode(Cd value) {
            this.problemCode = value;
        }
public void setProblemStatus(Ce value) {
            this.problemStatus = value;
        }
 //omitted getters
    }

Cd.java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "cd", propOrder = {
    "originalText",
})

public class Cd {

    protected Object originalText;

    @XmlAttribute(name = "code")
    @XmlSchemaType(name = "anySimpleType")
    protected String code;

    @XmlAttribute(name = "displayName")
    @XmlSchemaType(name = "anySimpleType")
    protected String displayName;

    @XmlAttribute(name = "codeSystem")
    @XmlSchemaType(name = "anySimpleType")
    protected String codeSystem;

    @XmlAttribute(name = "codeSystemName")
    @XmlSchemaType(name = "anySimpleType")
    protected String codeSystemName;

    @XmlAttribute(name = "nullFlavor")
    protected NullFlavorType nullFlavor;

//ommitted getters and setters

Cd.java类将用于许多其他类,而不仅仅是在Conditions.java类中。

我的问题特别是如何在Conditions.java中为problemType注释我的字段,其中problemType有4个属性和一个可选元素。

我将无法直接注释Cd.java,因为xml输入将根据我正在实现的类而有所不同(选择其他8个使用Cd.java类的类)。以上现有注释由Jaxb自动生成Conditions.java problemType的xml输入如下:

<PROBLEM_MODULE>
      <code>24434</code> //Maps to protected String code in Cd.java;
      <codeName>ICD-9</codeName> //Maps to protected String codeSystem in Cd.java;
      <display>Asthma</display> //Maps to protected String displayName in Cd.java;
      <codeSystem>2.564.34343.222</codeSystem> // Maps to protected String codeSystemName in Cd.java;
</PROBLEM_MODULE>

请告知我需要澄清我的问题。最后,我正在请求资源或教程来帮助我完成这项工作。

** * *** 更新 * ** * ** * Blaise的解决方案非常有效,因为我在另一个并不复杂的项目上进行了测试。因此,该方法是正确的,但有一些我错误的元数据文件。我更新了上面的Conditions.java文件,因为我遗漏了可能影响我实现元数据文件所需方式的细节。

我的oxm.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="conditions.exec"
    xml-mapping-metadata-complete="true">
     <java-types>
        <java-type name="Conditions" xml-accessor-type="FIELD">
            <xml-root-element name="PROBLEM_MODULE"/>
        </java-type>
        <java-type name="Cd" xml-accessor-type="FIELD">
            <java-attributes>
            <xml-type prop-order="code codeSystem displayName codeSystemName"/>
                <xml-element java-attribute="codeSystem" name="codeName"/>
                <xml-element java-attribute="displayName" name="display"/>
                <xml-element java-attribute="codeSystemName" name="codeSystem"/>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

* 主要类 *

public static void main(String[] args) {

        try {
        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, new File("src/conditions/exec/oxm.xml"));
        JAXBContext jc = JAXBContext.newInstance(new Class[] {Conditions.class,Cd.class}, properties);

            // create an Unmarshaller
            Unmarshaller u = jc.createUnmarshaller();
            conditions.exec.Conditions InventoryInput = (conditions.exec.Conditions) u.unmarshal( 
                        new File("src/conditions/exec/problems.xml")); //input file



            // create a Marshaller and marshal to a file



        Marshaller resultMarshaller = jc.createMarshaller();
        resultMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        resultMarshaller.marshal(InventoryInput, System.out); 

        } catch (JAXBException je) {
            je.printStackTrace();
        } 

1 个答案:

答案 0 :(得分:1)

您可以利用EclipseLink JAXB (MOXy)的外部绑定文件将第二个映射应用于您的类:

<强> oxm.xml

我在此文件中设置的一件事是xml-mapping-metadata-complete="true",此设置告诉MOXy完全忽略注释并只使用此文件。默认情况下,OXM文件用于补充注释。

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum7043389"
    xml-mapping-metadata-complete="true">
    <java-types>
        <java-type name="Root2">
            <xml-root-element/>
        </java-type>
        <java-type name="Cd">
            <xml-type prop-order="code codeSystem displayName codeSystemName"/>
            <java-attributes>
                <xml-element java-attribute="codeSystem" name="codeName"/>
                <xml-element java-attribute="displayName" name="display"/>
                <xml-element java-attribute="codeSystemName" name="codeSystem"/>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

<强>演示

oxm.xml文件作为属性传入以创建JAXBContext。在下面的示例中,在类上创建了jc1,并在类和jc2上创建了oxm.xml

package forum7043389;

import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

import org.eclipse.persistence.jaxb.JAXBContextFactory;

public class Demo {

    public static void main(String[] args) throws Exception {
        Cd cd = new Cd();
        cd.setCode("24434");
        cd.setCodeSystem("ICD-9");
        cd.setDisplayName("Asthma");
        cd.setCodeSystemName("2.564.34343.222");

        JAXBContext jc1 = JAXBContext.newInstance(Root1.class);
        Marshaller marshaller1 = jc1.createMarshaller();
        marshaller1.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        Root1 root1 = new Root1();
        root1.setCd(cd);
        marshaller1.marshal(root1, System.out);

        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum7043389/oxm.xml");
        JAXBContext jc2 = JAXBContext.newInstance(new Class[] {Root2.class}, properties);
        Marshaller marshaller2 = jc2.createMarshaller();
        marshaller2.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        Root2 root2 = new Root2();
        root2.setCd(cd);
        marshaller2.marshal(root2, System.out);
    }

}

<强>输出

以下是运行演示的输出:

<?xml version="1.0" encoding="UTF-8"?>
<root1>
   <cd code="24434" displayName="Asthma" codeSystem="ICD-9" codeSystemName="2.564.34343.222"/>
</root1>
<?xml version="1.0" encoding="UTF-8"?>
<root2>
   <cd>
      <code>24434</code>
      <codeName>ICD-9</codeName>
      <display>Asthma</display>
      <codeSystem>2.564.34343.222</codeSystem>
   </cd>
</root2>

<强>镉

package forum7043389;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "cd", propOrder = {"originalText",})
public class Cd {

    protected Object originalText;

    @XmlAttribute(name = "code")
    @XmlSchemaType(name = "anySimpleType")
    protected String code;

    @XmlAttribute(name = "displayName")
    @XmlSchemaType(name = "anySimpleType")
    protected String displayName;

    @XmlAttribute(name = "codeSystem")
    @XmlSchemaType(name = "anySimpleType")
    protected String codeSystem;

    @XmlAttribute(name = "codeSystemName")
    @XmlSchemaType(name = "anySimpleType")
    protected String codeSystemName;

    @XmlAttribute(name = "nullFlavor")
    protected NullFlavorType nullFlavor;

    public Object getOriginalText() {
        return originalText;
    }

    public void setOriginalText(Object originalText) {
        this.originalText = originalText;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getDisplayName() {
        return displayName;
    }

    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }

    public String getCodeSystem() {
        return codeSystem;
    }

    public void setCodeSystem(String codeSystem) {
        this.codeSystem = codeSystem;
    }

    public String getCodeSystemName() {
        return codeSystemName;
    }

    public void setCodeSystemName(String codeSystemName) {
        this.codeSystemName = codeSystemName;
    }

    public NullFlavorType getNullFlavor() {
        return nullFlavor;
    }

    public void setNullFlavor(NullFlavorType nullFlavor) {
        this.nullFlavor = nullFlavor;
    }

}

<强>目录root1

package forum7043389;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Root1 {

    private Cd cd;

    public Cd getCd() {
        return cd;
    }

    public void setCd(Cd cd) {
        this.cd = cd;
    }

}

<强>根-2

package forum7043389;

public class Root2 {

    private Cd cd;

    public Cd getCd() {
        return cd;
    }

    public void setCd(Cd cd) {
        this.cd = cd;
    }

}

了解更多信息