アンマーシャリング時にのみ取得できるように、XML で値を非表示にすることは可能ですか。
2 に答える
注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。
以下は、JAXB プロバイダーとして MOXy を使用している場合に、このユース ケースを実装するためのいくつかのオプションです。MOXy を JAXB プロバイダーとして使用するにはjaxb.properties
、次のエントリを使用して、ドメイン モデルと同じパッケージに名前が付けられたファイルを含める必要があります。
オプション1 -XmlAdapter
XmlAdapter
を使用して、マーシャリング操作中にプロパティ値を null にすることができます。はXmlAdapter
標準の JAXB クラスですが、メソッドから null を返すmarshal
と、JAXB 参照実装が使用されている場合に例外が発生します。
文字列アダプター
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class StringAdapter extends XmlAdapter<String, String> {
@Override
public String marshal(String string) throws Exception {
return null;
}
@Override
public String unmarshal(String string) throws Exception {
return string;
}
}
人
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement(name="Person")
public class Person {
String password;
@XmlJavaTypeAdapter(StringAdapter.class)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
オプション #2 - ゲッターなしのセッター
MOXy が JAXB プロバイダーとして使用されている場合、注釈付きのセッターがあり、ゲッターがないプロパティがある場合、MOXy はそれを読み取り専用プロパティとして扱います。
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Person")
public class Person {
String password;
@XmlElement
public void setPassword(String password) {
this.password = password;
}
}
オプション #3 - MOXy の@XmlReadOnly
拡張機能
MOXy の@XmlReadOnly
拡張機能を使用して、プロパティを読み取り専用としてマークすることもできます。
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlReadOnly;
@XmlRootElement(name="Person")
public class Person {
String password;
@XmlReadOnly
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
デモコード
入力.xml
<Person>
<password> some password </password>
</Person>
*デモ*
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum14231799/input.xml");
Person person = (Person) unmarshaller.unmarshal(xml);
System.out.println(person.password);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(person, System.out);
}
}
出力
some password
<?xml version="1.0" encoding="UTF-8"?>
<Person/>
次のアプローチは、任意のJAXB (JSR-222)実装で使用できます。
デモ
AMarshaller.Listener
を使用して、オブジェクトがマーシャリングされる前に値を null にしてから、後で復元することができます。
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum14231799/input.xml");
Person person = (Person) unmarshaller.unmarshal(xml);
System.out.println(person.password);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setListener(new Marshaller.Listener() {
private String password;
@Override
public void afterMarshal(Object object) {
if(object instanceof Person) {
Person person = (Person) object;
person.setPassword(password);
password = null;
}
}
@Override
public void beforeMarshal(Object object) {
if(object instanceof Person) {
Person person = (Person) object;
password = person.getPassword();
person.setPassword(null);
}
}
});
marshaller.marshal(person, System.out);
System.out.println(person.password);
}
}
入力.xml
<Person>
<password> some password </password>
</Person>
出力
some password
<?xml version="1.0" encoding="UTF-8"?>
<Person/>
some password