玩!框架ENUM和Groovy问题

时间:2011-08-07 16:28:51

标签: java templates groovy enums playframework

我有以下内容 -

Woman.java

...
@Entity
public class Woman extends Model {

    public static enum Outcome {
        ALIVE, DEAD, STILL_BIRTH, LIVE_BIRTH, REGISTER
    }
    ...
}

File.java

...
@Entity
public class Form extends Model {
    ...
    public Outcome autoCreateEvent;
    ...
}

create.html上

#{select "autoCreateEvent", items:models.Woman.Outcome.values(), id:'autoCreateEvent' /}

将DBUM中的ENUM值保存,即可。但是,当我重新加载/编辑时,问题就出现了。因为它使用ALIVE,DEAD等作为选项的值,所以它无法正确显示列表。

任何洞察力?

2 个答案:

答案 0 :(得分:3)

如果我理解您的问题,您可以使用valuePropertylabelPropertyoption中设置正确的值。类似的东西:

#{select "autoCreateEvent", items:models.Woman.Outcome.values(), valueProperty:'ordinal', labelProperty: 'name', id:'autoCreateEvent' /}

编辑:

为了实现这一点,你需要稍微调整枚举,如下所示:

public enum Outcome {
  A,B;

  public int getOrdinal() {
     return ordinal();
  }

}

原因是Play#{select}期望获取valuePropertylabelProperty参数中的getter,未找到时默认为枚举toString

答案 1 :(得分:1)

要添加到上一个答案,请将其添加到您的Enum声明:

public String getLabel() {
    return play.i18n.Messages.get(name());
}

请务必使用以下声明:

#{select "[field]", items:models.[Enum].values(), valueProperty:'name', labelProperty: 'label' /}

您也可以在枚举中添加:

    @Override
public String toString() {
    return getLabel();
}

如果要在视图文件中显示国际化值(因为在显示时自动调用toString),但函数name()使用toString(),这将非常有用,因此您必须将valueProperty绑定到另一个函数,如遵循:

public String getLabel(){
    return toString();
}

public String getKey() {
    return super.toString();
}

@Override
public String toString() {
    return Messages.get(name());
}

#select使用:

#{select "[field]", items:models.[Enum].values(), value:flash.[field], valueProperty:'key', labelProperty: 'label' /}