Java JAXB";更名为;子类中父类的属性

Java JAXB";更名为;子类中父类的属性,java,jaxb,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类家长

@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类

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

我的想法是重新声明字段id,并使用
xmltransive
,但它不起作用,在编组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>
          ...

...
有什么想法吗?

试试这个:

@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);
    }

}

请注意@XmlAccessorType设置为XmlAccessType.PROPERTY

或者,您也可以使用XmlAccessType.FIELD执行此操作,如下所示:

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = 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>

0
0
0
1.
0
0
2.
还是你不喜欢这种方法?

试试这个:

@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);
    }

}

请注意@XmlAccessorType设置为XmlAccessType.PROPERTY

或者,您也可以使用XmlAccessType.FIELD执行此操作,如下所示:

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = 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>

0
0
0
1.
0
0
2.

还是您不喜欢这种方法?

谢谢。我已经想到了这一点,但问题是我有10个或更多的
A
子类,其中我确实需要名为
id
的属性。为了方便起见,我会在帖子中回复hey@mart,这是可行的。但是它的问题是,任何创建
a
的新子类的开发人员都必须小心并实现
id
。我觉得应该在
A
中指定默认值。我要寻找的是JAXB中的
com.fasterxml.jackson.annotation.JsonIgnoreProperties
等价物。Hi@RockyMM,是的,我感觉你可能不喜欢重复。试图找到一种方法来避免它,但还没有成功。谢谢你。我已经想到了这一点,但问题是我有10个或更多的
A
子类,其中我确实需要名为
id
的属性。为了方便起见,我会在帖子中回复hey@mart,这是可行的。但是它的问题是,任何创建
a
的新子类的开发人员都必须小心并实现
id
。我觉得应该在
A
中指定默认值。我要寻找的是JAXB中的
com.fasterxml.jackson.annotation.JsonIgnoreProperties
等价物。Hi@RockyMM,是的,我感觉你可能不喜欢重复。试图找到一种方法来避免它,但还没有成功。