3

そのプロパティの名前のみを使用して、属性/要素の値をJAXBオブジェクトに設定することは可能ですか?

例:

クラスがある場合

@XmlRootElement(name = "book")
public class Book {

  @XmlElement(name = "title")
  private String name;
  @XmlElement(name = "author")
  private String author;

  // setters and getters
}

setter(setName())を使用せずに名前を設定できますが、xml要素名しかわかりませんか?この場合はどちらですか"title"。次のようになります。

JAXBContext context = JAXBContext.newInstance(Book.class);
Something s = context.create***();
s.setValueToObject(book, "title", "New name"); // should do the same like book.setName("New name")
4

2 に答える 2

1

注: 私は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
于 2012-12-19T12:49:28.797 に答える
0

最良の方法は、セッターを介してそれらを提供することです。

あなたの方法なら

s.setValueToObject(book, "title", "New name"); // should do the same like book.setName("New name")

あなたのためにセッターの仕事をしてください。それからそれも正しい

于 2012-12-19T12:28:11.977 に答える