簡體   English   中英

JAXB - 防止空屬性 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"

[英]JAXB - Prevent nillable attributes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"

這是我的問題:我需要在 XML 中存在 by 對象的名稱標簽,但沒有可空屬性:簡而言之,就像<name/> 這是對象的代碼。 如果 name 為空,我會得到標簽<name xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/> ,但附加屬性可能會導致問題給客戶。

正如我所讀到的,從語義上講,以這種方式表示空值確實有意義(使用@XmlElement(nillable=true) )。

    package com.mns.mnsutilities.jaxb.model;

    import java.util.ArrayList;
    import java.util.List;

    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlElementWrapper;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlTransient;
    import javax.xml.bind.annotation.XmlType;


    @XmlRootElement(name="Emp_MNS")
    @XmlType(propOrder= {"name", "age", "role", "gender", "addressesList"})
    public class Employee {
        private int id;
        private String gender;
        private int age;
        private String name;
        private String role;
        private String password;
        private List<Address> addressesList;

        public Employee() {}

        public Employee(int id, String gender, int age, String name, String role,
                String password) {
            super();
            this.id = id;
            this.gender = gender;
            this.age = age;
            this.name = name;
            this.role = role;
            this.password = password;
        }

        public Employee(int id, String gender, int age, String name, String role,
                String password, List<Address> addressesList) {
            super();
            this.id = id;
            this.gender = gender;
            this.age = age;
            this.name = name;
            this.role = role;
            this.password = password;
            this.addressesList = addressesList;
        }

        @XmlAttribute
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        @XmlElement(name = "gen", nillable=true)
        public String getGender() {
            return gender;
        }
        public void setGender(String gender) {
            this.gender = gender;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @XmlElement(nillable=true)
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getRole() {
            return role;
        }
        public void setRole(String role) {
            this.role = role;
        }
        @XmlTransient
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        @XmlElementWrapper( name="addresses" )
        @XmlElement(name = "address")
        public List<Address> getAddressesList() {
            if(addressesList == null){
                addressesList = new ArrayList<>();
            }
            return addressesList;
        }

        public void setAddressesList(List<Address> addressesList) {
            this.addressesList = addressesList;
        }

        @Override
        public String toString() {
            return "Employee [id=" + id + ", gender=" + gender + ", age=" + age
                    + ", name=" + name + ", role=" + role + ", password="
                    + password + ", addressesList=" + addressesList + "]";
        }
    }

擴展由 Ian Roberts 發表的評論,您可以利用字段訪問並將該屬性將字段值""視為空值。

@XmlRootElement(name="Emp_MNS")
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee {

    private String name = "";

    public String getName() {
        if(name.length() == 0) {
            return null;
        }
        return name;
    }

    public void setName(String name) {
        if(null == name) {
            this.name = "";
        } else {
            this.name = name;
        }
    }

我也遇到了同樣的問題,但是我的字段是enum,不能是emyty字符串;所以我就用

myXml.replaceAll("xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"","")

在另一個解決方案中,我向枚舉添加了一個空字符串值,例如

@XmlEnum
@Getter
public enum MyEnum {


    @XmlEnumValue("1") Apple("1"),
    @XmlEnumValue("2") Banner("2"),
    @XmlEnumValue("") NULL("3");

    MyEnum(String value, String description) {
        this.value = value;
        this.description = description;
    }

    private String value;

    private String description;
}

這樣我就可以將 MyEnum.NULL 設置為歸檔;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM