具有多个属性的Jax-ws Enum

时间:2013-08-11 12:06:32

标签: java jax-ws enumeration

我有一个类型类:

@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”错误=“没有错误”

我怎样才能做到这一点?

1 个答案:

答案 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