3

アンマーシャリング時にのみ取得できるように、XML で値を非表示にすることは可能ですか。

4

2 に答える 2

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/>
于 2013-01-10T10:33:07.880 に答える
1

次のアプローチは、任意の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 
于 2013-01-10T10:53:52.177 に答える