我的解组结果对于元素Root是错误的。它包含对其自己的子类的引用,以使用key作为属性,并且它具有对另一个子类的引用。我正在使用MOXy版本2.7.0和jdk8u45。
我创建了一个这样的根元素:
Root root = new Root("rootKey", "subKey");
编组导致正确的xml输出:
<root name="rootKey"><sub name="subKey"/></root>
解组此xml会导致错误的对象。生成的对象具有两个键名称的“subKey”。我的设置有问题还是这个错误?
Root类看起来像这样:
@XmlRootElement(name = "root")
public class Root {
@XmlPath(".")
private final Root.Key key;
@XmlElement(name = "sub")
private final Sub.Key subKey;
public Root(String name, String subName) {
this.key = new Root.Key(name);
this.subKey = new Sub.Key(subName);
}
private Root() {
this(null, null);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((key == null) ? 0 : key.hashCode());
result = prime * result + ((subKey == null) ? 0 : subKey.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (obj != null && obj.getClass().equals(this.getClass())) {
Root o = (Root)obj;
return key.equals(o.key) && subKey.equals(o.subKey);
}
return false;
}
@Override
public String toString() {
return "Root [key=" + key + ", subKey=" + subKey + "]";
}
@XmlType(name = "Root.Key")
@XmlRootElement
public static final class Key {
@XmlAttribute
private final String name;
public Key(String name) {
this.name = name;
}
private Key() {
// Constructor for JAXB
this(null);
}
public String getName() {
return name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (obj != null && obj.getClass().equals(this.getClass())) {
Key o = (Key)obj;
return name.equals(o.name);
}
return false;
}
@Override
public String toString() {
return "Key [name=" + name + "]";
}
}
}
Sub类是:
@XmlRootElement(name = "sub")
public class Sub {
@XmlType(name = "Sub.Key")
@XmlRootElement
public static final class Key {
@XmlAttribute
private final String name;
public Key(String name) {
this.name = name;
}
private Key() {
// Constructor for JAXB
this(null);
}
public String getName() {
return name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (obj != null && obj.getClass().equals(this.getClass())) {
Key o = (Key)obj;
return name.equals(o.name);
}
return false;
}
@Override
public String toString() {
return "Key [name=" + name + "]";
}
}
}
答案 0 :(得分:1)
试试这个:
你的根类
@XmlRootElement(name = "root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
@XmlAttribute(name = "name")
private final Root.Key key;
@XmlElement(name = "sub")
private final Sub.Key subKey;
public Root(String name, String subName) {
this.key = new Root.Key(name);
this.subKey = new Sub.Key(subName);
}
private Root() {
this(null, null);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((key == null) ? 0 : key.hashCode());
result = prime * result + ((subKey == null) ? 0 : subKey.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (obj != null && obj.getClass().equals(this.getClass())) {
Root o = (Root)obj;
return key.equals(o.key) && subKey.equals(o.subKey);
}
return false;
}
@Override
public String toString() {
return "Root [key=" + key + ", subKey=" + subKey + "]";
}
@XmlType(name = "Root.Key")
@XmlRootElement
public static final class Key {
@XmlValue
private final String name;
public Key(String name) {
this.name = name;
}
public Key() {
// Constructor for JAXB
this(null);
}
public String getName() {
return name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (obj != null && obj.getClass().equals(this.getClass())) {
Key o = (Key)obj;
return name.equals(o.name);
}
return false;
}
@Override
public String toString() {
return "Key [name=" + name + "]";
}
}
}
Sub class
@XmlAccessorType(XmlAccessType.FIELD)
public class Sub {
@XmlType(name = "Sub.Key")
public static final class Key {
@XmlAttribute(name = "name")
private final String name;
public Key(String name) {
this.name = name;
}
public Key() {
// Constructor for JAXB
this(null);
}
public String getName() {
return name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (obj != null && obj.getClass().equals(this.getClass())) {
Key o = (Key)obj;
return name.equals(o.name);
}
return false;
}
@Override
public String toString() {
return "Key [name=" + name + "]";
}
}
}
你应该能够编组/解组。