有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

具有多个属性的java Jaxws枚举

我有一个类型类:

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

我得到的结果是:记录状态=“确定” 但我想要:记录状态=“确定”错误=“无错误”

我怎样才能做到这一点


共 (1) 个答案

  1. # 1 楼答案

    这与您期望的方式不同,因为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