gpt4 book ai didi

java - 子类的解码结果不正确

转载 作者:行者123 更新时间:2023-12-02 11:52:15 26 4
gpt4 key购买 nike

我的解码结果对于元素 Root 来说是错误的。它包含对其自己的子类的引用以将键用作属性,并且它具有对另一个子类的引用。我使用的是 MOXy 版本 2.7.0 和 jdk8u45。

我创建一个像这样的根元素:

Root root = new Root("rootKey", "subKey");

编码会产生正确的 xml 输出:

<root name="rootKey"><sub name="subKey"/></root>

解码此 xml 会产生不正确的对象。生成的对象的两个键名都具有“subKey”。我的设置有问题还是这是一个错误?

根类如下所示:

@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 + "]";
}
}
}

子类是:

@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 + "]";
}
}
}

最佳答案

试试这个:

你的根类

@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 + "]";
}
}
}

和子类

@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 + "]";
}
}
}

并且您应该能够编码/解码。

关于java - 子类的解码结果不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47810805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com