Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jaxb 在xml中隐藏仅在解组时才能检索的值_Jaxb_Jaxb2 - Fatal编程技术网

Jaxb 在xml中隐藏仅在解组时才能检索的值

Jaxb 在xml中隐藏仅在解组时才能检索的值,jaxb,jaxb2,Jaxb,Jaxb2,是否可以在XML中隐藏值,以便只有在解组时才能检索该值。注意:我是专家组的负责人和成员 如果您使用MOXy作为JAXB提供程序,下面是实现此用例的一些选项。要使用MOXy作为JAXB提供程序,您需要在与域模型相同的包中包含一个名为JAXB.properties的文件,其中包含以下条目: 选项#1-XmlAdapter 在封送处理操作期间,可以使用XmlAdapter将属性值置零。虽然XmlAdapter是一个标准的JAXB类,但是从marshal方法返回null会导致在使用JAXB引用实现时发生

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

注意:我是专家组的负责人和成员

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

选项#1-
XmlAdapter

在封送处理操作期间,可以使用
XmlAdapter
将属性值置零。虽然
XmlAdapter
是一个标准的JAXB类,但是从
marshal
方法返回null会导致在使用JAXB引用实现时发生异常

StringAdapter

import javax.xml.bind.annotation.adapters.XmlAdapter;
公共类StringAdapter扩展了XmlAdapter{
@凌驾
公共字符串封送处理程序(字符串)引发异常{
返回null;
}
@凌驾
公共字符串解组器(字符串字符串)引发异常{
返回字符串;
}
}

import javax.xml.bind.annotation.*;
导入javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement(name=“Person”)
公共阶层人士{
字符串密码;
@XmlJavaTypeAdapter(StringAdapter.class)
公共字符串getPassword(){
返回密码;
}
public void setPassword(字符串密码){
this.password=密码;
}
}
选项#2-无Getter的Setter

当MOXy用作JAXB提供程序时,如果您有一个带有注释setter的属性,而没有getter,那么MOXy将把它当作只读属性

import javax.xml.bind.annotation.*;
@XmlRootElement(name=“Person”)
公共阶层人士{
字符串密码;
@XmlElement
public void setPassword(字符串密码){
this.password=密码;
}
}
选项#3-MOXy的
@XmlReadOnly
扩展

MOXy的
@XmlReadOnly
扩展还可用于将属性标记为只读

import javax.xml.bind.annotation.*;
导入org.eclipse.persistence.oxm.annotations.XmlReadOnly;
@XmlRootElement(name=“Person”)
公共阶层人士{
字符串密码;
@XmlReadOnly
公共字符串getPassword(){
返回密码;
}
public void setPassword(字符串密码){
this.password=密码;
}
}
演示代码

input.xml


一些密码
*演示*

导入java.io.File;
导入javax.xml.bind.*;
公开课演示{
公共静态void main(字符串[]args)引发异常{
JAXBContext jc=JAXBContext.newInstance(Person.class);
Unmarshaller Unmarshaller=jc.createUnmarshaller();
文件xml=新文件(“src/forum14231799/input.xml”);
Person=(Person)unmarshaller.unmarshal(xml);
System.out.println(个人密码);
Marshaller=jc.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
封送员。封送员(人员、系统、输出);
}
}
输出

一些密码

以下方法可用于任何实现

演示

可以使用
Marshaller.Listener
在封送对象之前清空值,然后再还原它

导入java.io.File;
导入javax.xml.bind.*;
公开课演示{
公共静态void main(字符串[]args)引发异常{
JAXBContext jc=JAXBContext.newInstance(Person.class);
Unmarshaller Unmarshaller=jc.createUnmarshaller();
文件xml=新文件(“src/forum14231799/input.xml”);
Person=(Person)unmarshaller.unmarshal(xml);
System.out.println(个人密码);
Marshaller=jc.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
setListener(新的marshaller.Listener(){
私有字符串密码;
@凌驾
公共无效后封送处理(对象){
if(Person的对象实例){
Person=(Person)对象;
person.setPassword(密码);
密码=null;
}
}
@凌驾
预封送处理前的公共无效(对象){
if(Person的对象实例){
Person=(Person)对象;
password=person.getPassword();
person.setPassword(空);
}
}
});
封送员。封送员(人员、系统、输出);
System.out.println(个人密码);
}
}
input.xml


一些密码
输出

一些密码
一些密码