当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出?

当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出?

问题:

orderStatus 和 payStatus都是枚举类,并且枚举的个数达地10来个,我们不可能在模板页面(jsp/ftl/html)等页面进行多大10多项的if判断,去一个一个的判断值,假如以后随着业务的增多,枚举个数越来越多,改怎么办?

 
/**订单*/
@Data //get/set
//将值是null的数据剔除
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderDTO {

    private String orderId;

    /**买家名字**/
    private String buyerName;

    /**买家手机**/
    private String buyerPhone;

    /**买家地址**/
    private String buyerAddr;

    /**用户openid**/
    private String buyerOpenid;

    /**订单金额**/
    private BigDecimal buyerAmount;

    /**订单状态, 默认状态0新订单**/
    private Integer orderStatus;

    /**支付状态, 默认状态0等待支付**/
    private Integer payStatus;

    private Date createTimestamp;

    private Date updateTimestamp;

    List<OrderDetail> orderDetailList;

    

}

  

解决方法:

思路:

1,新建一个interface的接口类:codeEnum,其方法有一个:Integer getCode();

注意,因为每个枚举实体中都会有一个: Integer code的属性,所以适用.

2.在建一个公用的EnumUtil公具类,将code值,和枚举类(泛型)传入其中,并且在返回类型中对枚举进行说明,限制其必须是实现codeEnum的getCode方法

比如:<T(泛型) extends codeEnum> T 这样就能调用 getCode方法

3.所有枚举类需要实现codeEnum类,及其getCode方法

大概思路有了,那么代码:

codeEnum.java

public interface CodeEnum {

    Integer getCode();
}

  

OrderStatusEnum.java

@Getter //get/set
public enum  OrderStatusEnum implements CodeEnum {

    NEW(0, "新订单"),
    FINISHED(1, "完结"),
    CANCEL(2, "取消");

    private Integer code;

    private String message;


    OrderStatusEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

  

PayStatus.java

@Getter //get
public enum  PayStatusEnum implements CodeEnum {

    WAIT(0, "等待支付"),
    SUCCESS(1, "支付完成");

    private Integer code;

    private String message;

    PayStatusEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

  

EnumUtil.java

public class EnumUtil {

    /**
     * 1.Class<T> enumClass枚举类
     * 2.<T extends CodeEnum>对枚举的说明,enumClass需要继承CodeEnum,才能调用each.getCode()方法
     * @param code
     * @param enumClass
     * @param <T>
     * @return
     */
    public  static <T extends CodeEnum>T getByCode(Integer code, Class<T> enumClass)
    {
        for (T each: enumClass.getEnumConstants())
        {
            if(code.equals(each.getCode()))
            {
                return each;
            }
        }
        return null;
    }
}

  

然后在DTO实体类中可以这样写了

/**
     * 当orderDTO转成json格式时,是多出getOrderStatusEnum字段,
     * 此注解表示屏蔽此字段的输出
     **/
    @JsonIgnore
    public OrderStatusEnum getOrderStatusEnum()
    {
        return EnumUtil.getByCode(orderStatus, OrderStatusEnum.class);
    }

    /**
     * 当orderDTO转成json格式时,是多出getOrderStatusEnum字段,
     * 此注解表示屏蔽此字段的输出
     **/
    @JsonIgnore
    public PayStatusEnum getPayStatusEnum()
    {
        return EnumUtil.getByCode(payStatus, PayStatusEnum.class);
    }

  

完成代码:

/**订单*/
@Data //get/set
//将值是null的数据剔除
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderDTO {

    private String orderId;

    /**买家名字**/
    private String buyerName;

    /**买家手机**/
    private String buyerPhone;

    /**买家地址**/
    private String buyerAddr;

    /**用户openid**/
    private String buyerOpenid;

    /**订单金额**/
    private BigDecimal buyerAmount;

    /**订单状态, 默认状态0新订单**/
    private Integer orderStatus;

    /**支付状态, 默认状态0等待支付**/
    private Integer payStatus;

    private Date createTimestamp;

    private Date updateTimestamp;

    List<OrderDetail> orderDetailList;

    /**
     * 当orderDTO转成json格式时,是多出getOrderStatusEnum字段,
     * 此注解表示屏蔽此字段的输出
     **/
    @JsonIgnore
    public OrderStatusEnum getOrderStatusEnum()
    {
        return EnumUtil.getByCode(orderStatus, OrderStatusEnum.class);
    }

    /**
     * 当orderDTO转成json格式时,是多出getOrderStatusEnum字段,
     * 此注解表示屏蔽此字段的输出
     **/
    @JsonIgnore
    public PayStatusEnum getPayStatusEnum()
    {
        return EnumUtil.getByCode(payStatus, PayStatusEnum.class);
    }

}

  

然后在模板渲染中可这样:

 ${orderDTO.getOrderStatusEnum().message}

<#list orderDTOPage.content as orderDTO>
                <tr>
                    <td>
                        ${orderDTO.orderId}
                    </td>
                    <td>
                        ${orderDTO.buyerName}
                    </td>
                    <td>
                        ${orderDTO.buyerPhone}
                    </td>
                    <td>
                        ${orderDTO.buyerAddr}
                    </td>
                    <td>
                        ${orderDTO.buyerAmount}
                    </td>
                    <td>
                        ${orderDTO.getOrderStatusEnum().message}
                    </td>
                    <td>
                        ${orderDTO.getPayStatusEnum().message}
                    </td>
                    <td>
                        ${orderDTO.createTimestamp}
                    </td>
                </tr>
                </#list>

  


/**订单*/
@Data //get/set
//将值是null的数据剔除
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderDTO {

private String orderId;

/**买家名字**/
private String buyerName;

/**买家手机**/
private String buyerPhone;

/**买家地址**/
private String buyerAddr;

/**用户openid**/
private String buyerOpenid;

/**订单金额**/
private BigDecimal buyerAmount;

/**订单状态, 默认状态0新订单**/
private Integer orderStatus;

/**支付状态, 默认状态0等待支付**/
private Integer payStatus;

private Date createTimestamp;

private Date updateTimestamp;

List<OrderDetail> orderDetailList;

/**
* orderDTO转成json格式时,是多出getOrderStatusEnum字段,
* 此注解表示屏蔽此字段的输出
**/
@JsonIgnore
public OrderStatusEnum getOrderStatusEnum()
{
return EnumUtil.getByCode(orderStatus, OrderStatusEnum.class);
}

/**
* orderDTO转成json格式时,是多出getOrderStatusEnum字段,
* 此注解表示屏蔽此字段的输出
**/
@JsonIgnore
public PayStatusEnum getPayStatusEnum()
{
return EnumUtil.getByCode(payStatus, PayStatusEnum.class);
}

}

猜你喜欢

转载自www.cnblogs.com/achengmu/p/10012155.html