JAXB - 在生成xml时,我们可以在生成之前检查对象的值

时间:2011-11-10 08:03:30

标签: java jaxb

假设我有一个对象

@XmlRootElement(name = "publisher")
class Person
{
 @XmlElement(required = true)
 int id;
 @XmlElement(required = true)
 String name;
}

我想生成像

<person>
<id>1</id>
<name>test</name>
</person>

假设名称是test10我不想在我的xml中使用该项目。无论如何要实现这一点。

1 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

用例#1 - 不是基于名称元素的Marshal Person对象

如果人是根对象

如果Person是根对象,那么您可以按照JB Nizet在此问题的评论中的建议执行以下操作。

if (!"test10".equals(person.getName()) { 
    marshaller.marshal(person);
}

如果Person是引用对象

如果Person不是根对象,那么您可以对此用例使用XmlAdapter。它看起来像下面这样:

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class PersonAdapter extends XmlAdapter<Person, Person> {

    @Override
    public Person unmarshal(Person person) throws Exception {
        return person;
    }

    @Override
    public Person marshal(Person person) throws Exception {
       if(mull == person || "test10".equals(person.getName()) {
           return null;
       }
       return person;
    }

}

使用XmlAdapter注释指定@XmlJavaTypeAdapter。可以在字段/属性,类型和包级别配置此批注。有关示例,请参阅:

用例#2 - 基于其值的非元帅名称元素

如果您只是想避免根据其值调整name元素,那么您可以再次使用XmlAdapter

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class NameAdapter extends XmlAdapter<String, String> {

    @Override
    public String unmarshal(String string) throws Exception {
        return string;
    }

    @Override
    public String marshal(String string) throws Exception {
       if("test10".equals(string) {
           return null;
       }
       return string;
    }

}

您的Person课程如下:

@XmlRootElement(name = "publisher")
class Person
{
 @XmlElement(required = true)
 int id;
 @XmlElement(required = true)
 @XmlJavaTypeAdapter(NameAdapter.class)
 String name;
}