有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

子类中父类的java JAXB“重命名”属性

如果我有A类家长

@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
class A {
    private int id;
}

还有一个B班的孩子

@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
class B extends A {
    private int x;
    private int y;
    private int z;
}

在系统中还有许多C、D、X、Y、Z类,它们扩展了A类

我只想为B的实例将属性A#id重命名为B#somethingId

我的想法是重新声明字段id并使用XmlTransient,但它不起作用,在编组B时,我仍然有“id”:

@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
class B extends a {
    private int x;
    private int y;
    private int z;

    public Long getSomethingId() {
        return id;
    }

    @XmlElement
    public void setSomethingId(Long id) {
        super.setId(id);
    }   

    public Long getId() {
        return super.getId();
    }

    @XmlTransient
    public void setId(Long id) {
        super.setId(id);
    }

}

输出是

   <B>
          <id>
          <somethingId>
          ...

有什么想法吗


共 (1) 个答案

  1. # 1 楼答案

    试试这个:

    @XmlAccessorType(XmlAccessType.PROPERTY)
    @XmlRootElement(name= "B")
    public class B extends A {
        private int x;
        private int y;
        private int z;
    
    
        @Override
        public int getId() {
            return super.getId();
        }
    
        @Override
        @XmlElement(name = "somethingId")
        public void setId(int id) {
            super.setId(id);
        }
    
    }
    

    @XmlType
    @XmlAccessorType(XmlAccessType.PROPERTY)
    public class A {
        private int id;
    
        public int getId() {
            return id;
        }
    
        @XmlTransient
        public void setId(int id) {
            this.id = id;
        }
    }
    

    注意@XmlAccessorType设置为XmlAccessType。财产

    或者您也可以使用XmlAccessType来实现。字段,如下所示:

    @XmlType
    @XmlAccessorType(XmlAccessType.FIELD)
    public class A {
        @XmlTransient
        private int id;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    }
    

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlRootElement(name= "B")
    public class B extends A {
        private int x;
        private int y;
        private int z;
    
        @Override
        public int getId() {
            return super.getId();
        }
    
        @Override
        @XmlElement(name = "somethingId")
        public void setId(int id) {
            super.setId(id);
        }
    
    }
    

    编辑以答复评论:

    当然,您可以将id保留在所需的类中。例如,按照第二种方法,添加一个类,如:

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlRootElement(name= "C")
    public class C extends A {
        private int j;
        private int k;
    
        @Override
        public int getId() {
            return super.getId();
        }
    
        @Override
        @XmlElement(name = "id")
        public void setId(int id) {
            super.setId(id);
        }
    
    }
    

    这样就行了。如果我使用一个简单的main来演示它:

    public static void main(String[] args) {
            try {
                JAXBContext jaxbContext = JAXBContext.newInstance(B.class, C.class);
                Marshaller marshaller = jaxbContext.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    
                B b = new B();
                b.setId(1);
                marshaller.marshal(b, System.out);
    
                System.out.println();
    
                C c = new C();
                c.setId(2);
                marshaller.marshal(c, System.out);
            } catch (JAXBException e) {
                e.printStackTrace();
            }
        }
    

    将给您以下结果:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <B>
        <x>0</x>
        <y>0</y>
        <z>0</z>
        <somethingId>1</somethingId>
    </B>
    
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <C>
        <j>0</j>
        <k>0</k>
        <id>2</id>
    </C>
    

    还是你不喜欢这种方法