我有一个类型类:
@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;
}
}
我得到的结果是:记录状态=“确定” 但我想要: Record status="OK"error="No error"
我怎样才能实现这一目标?
最佳答案
这不会按照您期望的方式工作,因为 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
显示为 ok
而是在 XML 中)。请参阅 @XmlEnum 和 @XmlEnumValue 注释 here .
关于java - 具有多个属性的 Jax-ws Enum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18171740/