我有一个类型类:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="Record")
public class Record
{
@XmlAttribute(name="status")
private Status status ;
}
和枚举类:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"status","error"})
@XmlEnum
public enum Status
{
OK(0, "No error"),
ERROR(1, "Some error") ;
@XmlAttribute(name="status", required=true)
private Integer status ;
@XmlAttribute(name="error", required=true)
private String error ;
private Status(Integer status, String error)
{
this.status=status ;
this.error=error ;
}
@Override
public String toString()
{
return "Status:" + this.status + " Error:" + this.error;
}
}
我得到的结果是:记录状态=“确定” 但我希望:记录状态=“OK”错误=“没有错误”
我怎样才能做到这一点?
答案 0 :(得分:3)
这不会像您期望的那样工作,因为JAXB获取枚举名称而不是使用toString()
方法。但即使它确实如此,它仍然不会产生你想要的输出。它会产生:
<record status="Status:0 Error:No error"/>
使用普通的JAXB无法自动将单个字段扩展为多个XML属性。 MOXy JAXB实现允许您这样做,但我怀疑您是否正在使用此实现(有关详细信息,请参阅this question。)
最简单的解决方案是添加另一个包含错误消息的属性。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="Record")
public class Record
{
@XmlAttribute(name="status")
private Status status ;
@XmlAttribute(name="error")
private String getError(){
return status.getError();
}
}
public enum Status
{
OK(0, "No error"),
ERROR(1, "Some error") ;
private Integer status ;
private String error ;
private Status(Integer status, String error)
{
this.status=status ;
this.error=error ;
}
public String getError(){
return this.error;
}
}
此外,您实际上并不需要Status
枚举上的任何JAXB注释。您唯一需要的时间是,如果您希望XML中打印的值与枚举值不同(例如,您希望OK
在XML中显示为ok
)。请参阅@XmlEnum和@XmlEnumValue注释here。