是否可以隐藏XML中的值,以便只有在解组时才能检索它。
答案 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