玩! 框架ENUM和Groovy问题

我有类似以下的东西 –

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' /} 

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

任何洞察力?

如果我正确理解你的问题,你想使用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 params中valueProperty getter,而在找不到时默认为enum toString

要添加到上一个答案,请将其添加到您的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' /}