注: 私はEclipseLink JAXB(MOXy)のリーダーであり、JAXB(JSR-222)エキスパートグループのメンバーです。
プロパティ名による値の設定
APIを使用java.lang.reflect
して、オブジェクトに値を設定できます。
package forum13952415;
import java.lang.reflect.Field;
import javax.xml.bind.*;
public class ReflectionDemo {
public static void main(String[] args) throws Exception {
Customer customer = new Customer();
setValueToObject(customer, "firstName", "Jane");
setValueToObject(customer, "lastName", "Doe");
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(customer, System.out);
}
private static void setValueToObject(Object object, String property, Object value) throws Exception {
Class clazz = object.getClass();
Field field = clazz.getDeclaredField(property);
field.setAccessible(true);
field.set(object, value);
}
}
XPATHによる値の設定
MOXyは、XPathによってドメインオブジェクトの値を取得/設定する機能を提供します。以下に例を示します。
デモ
以下の例では、メソッドにアクセスするために、基盤となるMOXy実装を掘り下げる必要がありますsetValueByXPath
。
package forum13952415;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import org.eclipse.persistence.jaxb.JAXBHelper;
import org.eclipse.persistence.oxm.XMLContext;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Customer.class);
XMLContext xmlContext = JAXBHelper.unwrap(jc, XMLContext.class);
Customer customer = new Customer();
xmlContext.setValueByXPath(customer, "@id", null, 123);
xmlContext.setValueByXPath(customer, "first-name/text()", null, "Jane");
xmlContext.setValueByXPath(customer, "last-name/text()", null, "Doe");
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(customer, System.out);
}
}
出力
以下は、デモコードの実行からの出力です。
<?xml version="1.0" encoding="UTF-8"?>
<customer id="123">
<first-name>Jane</first-name>
<last-name>Doe</last-name>
</customer>
お客様
以下はサンプルドメインモデルです。XML名がJava名と異なるものを使用しました。
package forum13952415;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
@XmlAttribute(name="id")
private int primaryKey;
@XmlElement(name="first-name")
private String firstName;
@XmlElement(name="last-name")
private String lastName;
}
jaxb.properties
MOXyをJAXBプロバイダーとして使用するにはjaxb.properties
、ドメインモデルと同じパッケージで呼び出されるファイルを次のエントリで追加する必要があります(http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-asを参照)。 -your.html):
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory