2

I have a type class:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="Record")
public class Record
{
    @XmlAttribute(name="status")
    private Status status  ;
}   

and enum class:

@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;
    }
}

The result I am getting is: Record status="OK" but I want to have: Record status="OK" error="No error"

How can I achieve that ?

4

1 回答 1

3

这不像您期望的那样工作,因为 JAXB 获取枚举名称而不是使用该toString()方法。但即使这样做了,它仍然不会产生你想要的输出。它会产生:

<record status="Status:0 Error:No error"/>

使用普通的 JAXB 无法自动将单个字段扩展为多个 XML 属性。MOXy JAXB 实现确实允许您执行此操作,但我怀疑您是否正在使用此实现(有关更多信息,请参阅此问题。)

最简单的解决方案是添加另一个包含错误消息的属性。

@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 中打印的值与枚举值不同(就像您希望在 XMLOK中显示的值一样ok)。请参阅此处的 @XmlEnum 和 @XmlEnumValue 注释。

于 2013-08-11T13:38:12.467 回答