1

私は JaxB を使い始めており、Moxy 実装を使用しています。Jaxb を使用して Java オブジェクト モデルに変換した業界標準の xsd があります。文字列、整数、日付などの単純なフィールドに注釈を付けることができました。

私は検索しており、4 つの属性とオプションの文字列要素を持つ xsd 複合型である次のフィールドに注釈を付けるために、正しい方向を指す必要があります。生成されたコードのサブセットは次のとおりです。

条件.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 つの属性と 1 つのオプション要素があります。

実装しているクラス (Cd.java クラスを使用する 8 つの他のクラスの選択) によって xml 入力が異なるため、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();
        } 
4

1 に答える 1

1

EclipseLink JAXB (MOXy)の外部バインディング ファイルを利用して、クラスに 2 番目のマッピングを適用できます。

oxm.xml

このファイルで設定したことの 1 つは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 ファイルは、.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>

CD

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

}

ルート1

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

}

詳細については

于 2011-08-12T18:32:14.623 に答える