Java JAXB";更名为;子类中父类的属性
如果我有A类家长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类,它们扩展了
@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,是的,我感觉你可能不喜欢重复。试图找到一种方法来避免它,但还没有成功。