【发布时间】:2013-07-22 15:28:23
【问题描述】:
我在一个类中有一个属性'abc'。我想将此属性限制为转换为 XML 字符串格式。
我可以在属性上使用任何 XMl 注释,以避免将其转换为 XML 字符串吗?
请有人帮我解决这个问题。
【问题讨论】:
标签: java xml annotations
我在一个类中有一个属性'abc'。我想将此属性限制为转换为 XML 字符串格式。
我可以在属性上使用任何 XMl 注释,以避免将其转换为 XML 字符串吗?
请有人帮我解决这个问题。
【问题讨论】:
标签: java xml annotations
您可以使用@XmlTransient 注解。
欲了解更多信息,请访问@XmlTransient Sample
下面是在 JAXB 中避免 XML 转换中的“密码”属性的示例。所以它用
注释
@XmlTransient 注解
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlType(propOrder = { "phoneNumbers", "name"})
public class Customer extends Person {
private String password;
private List<String> phoneNumbers;
@XmlTransient
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@XmlElement(name = "phone-number")
public List<String> getPhoneNumbers() {
return phoneNumbers;
}
public void setPhoneNumbers(List<String> phoneNumbers) {
this.phoneNumbers = phoneNumbers;
}
}
/* demo class*/
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("input.xml");
Customer customer = (Customer) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(customer, System.out);
}
}
/*Generated xml doesn't have password tag */
/* <?xml version="1.0" encoding="UTF-8"?>
<customer>
<id>123</id>
<phone-number>555-1111</phone-number>
<phone-number>555-2222</phone-number>
<name>Jane Doe</name>
</customer>
*/
【讨论】:
当您使用JAXB (JSR-222) 实现来处理您的 XML 时,您有几个选项可以排除属性。
选项 #1 - @XmlTransient
排除字段/属性的最常见方法是使用@XmlTransient 对其进行注释。
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
@XmlTransient
private String foo;
private String bar;
public void setFoo(String foo) {
this.foo = foo;
}
public void setBar(String bar) {
this.bar = bar;
}
}
选项 #2 - @XmlAccessorType(XmlAccessType.NONE)
如果你想排除一半以上的属性,我建议在你的类上设置@XmlAccessorType(XmlAccessType.NONE)。然后只会映射带注释的字段/属性。在下面的示例中,我们不必排除 foo,但必须特别包含 bar。
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Root {
private String foo;
@XmlElement
private String bar;
public void setFoo(String foo) {
this.foo = foo;
}
public void setBar(String bar) {
this.bar = bar;
}
}
选项 #3 - 瞬态
如果您正在使用字段访问,那么您也可以简单地将字段标记为瞬态以将其排除。
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
private transient String foo;
private String bar;
public void setFoo(String foo) {
this.foo = foo;
}
public void setBar(String bar) {
this.bar = bar;
}
}
演示
无论您选择哪个选项,都可以使用以下演示代码。
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Root root = new Root();
root.setFoo("FOO");
root.setBar("BAR");
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
}
}
输出
在输出中,我们看到foo 元素已从输出中排除。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<bar>BAR</bar>
</root>
更多信息
【讨论】:
你在找@XMLTransient吗?
【讨论】:
@XmlTransient 阻止将属性转换为 xml
【讨论】: