隐藏xml中的值,只有在解组时才能检索该值

时间:2013-01-09 14:17:30

标签: jaxb jaxb2

是否可以隐藏XML中的值,以便只有在解组时才能检索它。

2 个答案:

答案 0 :(得分:2)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。

如果您使用MOXy作为JAXB提供程序,以下是实现此用例的一些选项。要将MOXy用作JAXB提供程序,您需要在与域模型相同的包中包含名为jaxb.properties的文件,并使用以下条目:

选项#1 - XmlAdapter

XmlAdapter可用于在编组操作期间使属性值为空。虽然XmlAdapter是标准的JAXB类,但从marshal方法返回null会导致在使用JAXB参考实现时发生异常。

StringAdapter

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提供程序时,如果您的属性具有带注释的setter且没有getter,则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;
    }

}

DEMO CODE

input.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/>

答案 1 :(得分:1)

以下方法可用于任何JAXB (JSR-222)实施。

<强>演示

可以使用Marshaller.Listener在对象编组之前将值清零,然后再将其恢复。

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);
    }

}

<强> input.xml中

<Person>
    <password> some password </password>
</Person>

<强>输出

 some password 
<?xml version="1.0" encoding="UTF-8"?>
<Person/>
 some password