私はJaxBを使い始めていますが、Moxyの実装を使用しています。私はJaxbを使ってJava Object Modelに変換した業界標準のxsdを持っています。文字列、整数、日付のような簡単なフィールドに注釈を付ける限り、私は得ました。JAXB Moxy- xsd複合型のフィールドに注釈を付ける方法の質問
私は、4つの属性とオプションの文字列要素を持つxsd複合型の次のフィールドに注釈を付けるために正しい方向を指し示す必要があります。次のように生成されたコードのサブセットがある:
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クラスだけでなく、
ProblemTypeが4つの属性と1つのオプションの要素を持つConditions.javaのproblemTypeにフィールドを注釈する方法を私の質問で特に説明します。
Cd.javaに直接注釈を付けることはできません。xmlの入力は、実装しているクラス(Cd.javaクラスを使用する他の8つのクラスの中から選択)によって異なります。次のように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>
してください。最終的に私はこれを手助けするためのリソースやチュートリアルを要求しています。私は通りではない別のプロジェクトでそれをテストしたよう
*** *** *UPDATE* ** ** * ブレーズのソリューションは、完全に働きました複合体。したがって、この方法は正しいですが、メタデータファイルに間違っていることがあります。上記の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();
}
私はいくつかのコメントに上記の私のポストを更新しました。私はこれを別のプロジェクト(あまり複雑でないオブジェクトモデル)で動作させることができましたが、上記のオブジェクトモデル(Conditions.java、Cd.javaなど)で動作するようにはできませんでした。私のoxm.xmlファイルで間違っていることがあります。名前の衝突エラーが発生しています。 JAXBが生成したConditions.javaを更新しました。これは、重要だった可能性のある詳細を省きました。私もoxm.xmlファイルを追加しました。私はあなたの意見と提案を感謝します。 – Hjones
衝突エラーは表示されなくなりましたが、私のoxmファイルを正しく取得しようとしています。 – Hjones