enjoy 在使用共享方法枚举时候的问题

在 class EnumDefine中有这么一个枚举

public enum GoodsType {
    GOODS_TYPE_OTHER(0, "other"), //其他
    GOODS_TYPE_GENERAL(1, "general"), //普通商品
    GOODS_TYPE_TASK(2, "task"), //任务商品
    GOODS_TYPE_COUPON(3, "coupon"), //全抵商品
    GOODS_TYPE_DISCOUNT(4, "discount"); //折扣商品

    private Integer code;
    private String msg;

    GoodsType(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    /**
     * 根据枚举的code返回枚举对象
     *
     * @param code 枚举code值
     * @return 枚举对象
     */
    public static GoodsType getEnumByCode(Integer code) {
        if (code == null) return null;
        for (GoodsType status : values()) {
            if (status.getCode() == code)
                return status;
        }
        return null;
    }
}

我在config中去添加共享方法

public void configEngine(Engine me) {
   me.addSharedMethod(new EnumDefine());
}


前端html中去调用

<option value="#(type)">
    #if(type == GoodsType.GOODS_TYPE_GENERAL.getCode())
        #(message("Goods.Type." + GoodsType.GOODS_TYPE_GENERAL.getMsg()))
    #end
</option>

报错

com.jfinal.template.TemplateException: "GoodsType" can not be null for accessed by "GoodsType.GOODS_TYPE_GENERAL"

模板支持这么去调用枚举吗?

评论区

JFinal

2017-08-21 10:49

shared method 是共享方法,那么 me.addSharedMethod(new EnumDefine()); 这行代码只是将里头的 public 方法变为可以使用的,例如下面的这些方法:
public Integer getCode()
public String getMsg()
public static GoodsType getEnumByCode(Integer code)

而 GoodsType.GOODS_TYPE_GENERAL.getMsg() 这个与 shared method 完全无关了

yjjdick1990

2017-08-21 11:03

@JFinal 如果我想获取GOODS_TYPE_GENERAL这个枚举的code应该怎么写,波总。。。
而且我好多枚举方法名都一样比如
public enum GoodsOrderType {
GOODS_ORDER_TYPE_PRICEASC(1, "priceAsc"), //价格升序
GOODS_ORDER_TYPE_PRICEDESC(2, "priceDesc"), //价格降序
GOODS_ORDER_TYPE_SALESDESC(3, "salesDesc"), //销量降序
GOODS_ORDER_TYPE_SCOREDESC(4, "scoreDesc"), //评分降序
GOODS_ORDER_TYPE_DATEDESC(5, "dateDesc"); //日期降序

private Integer code;
private String msg;

GoodsOrderType(Integer code, String msg) {
this.code = code;
this.msg = msg;
}

public Integer getCode() {
return code;
}

public String getMsg() {
return msg;
}

/**
* 根据枚举的code返回枚举对象
*
* @param code 枚举code值
* @return 枚举对象
*/
public static GoodsOrderType getEnumByCode(Integer code) {
if (code == null) return null;
for (GoodsOrderType status : values()) {
if (status.getCode() == code)
return status;
}
return null;
}
}
那是不是我getCode和GetMsg要换个名字啊比如getXXXCode和getXXXMsg不然是不是方法覆盖了?

yjjdick1990

2017-08-21 11:15

@JFinal 而且那些枚举都是写在同一个class中的都是在EnumDefine的这个class,我所有的枚举都再写这里是准备时候写个转表工具去转xml,让策划去改xml的数据这样程序和策划的工作就解耦了。
所以如果EnumDefine这个类里的枚举都是一个方法名是不是就全部被最后一个枚举的public覆盖了?
我前端其实是想去取GOODS_TYPE_GENERAL这个的code我改怎么去写呢

JFinal

2017-08-21 11:24

@yjjdick1990 建议你从现有的 shared method、shared object、extension method 中找找解决办法,先看一下文档,了解了基本用法以后或许有解决办法。此外,还有 static method 调用的方式

我看到你的需求,无非就是想获取枚举对象用于模板中的比较操作,下面给出一个简单方案:
1:假定你的代码希望这么来用:
#if(type == GoodsType.GOODS_TYPE_GENERAL.getCode())

2:可以为 GoodsType 这个枚举添加类似于下面的方法:
public GoodsType getGOODS_TYPE_GENERAL() {
return GoodsType.GOODS_TYPE_OTHER;
}

3:添加完成以后,再将 GoodsType 添加为共享对象:
engine.addSharedObject("GoodsType", new GoodsType());

4:由于 GoodsType.GOODS_TYPE_GENERAL 这个字段取值表达式会优先调用 getter 方法,所以 getGOODS_TYPE_GENERAL() 方法会被调用

记得 搞定后回来分享一下

yjjdick1990

2017-09-04 21:05

这个我之后会搞一套前后台共享枚举的解决方案分享出来,现在有个工具我还没时间写

maxwade

2018-03-30 11:23

@yjjdick1990 我最近也遇到这个问题了,枚举的构造方法是私有的,好像无法做成shareObject()

laofa

2019-10-14 22:27

请问各位大佬,有解决方案了吗

laofa

2019-10-14 22:31

能否结合一下枚举类型的ordinal()方法,根据对应的枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零),与数据库取出来的枚举值比对,对照对应的中文值。