Play框架MVC中如何比较枚举的String值与字符串常量
问题原因
- 模型层的
getStatus方法存在类型定义错误:返回值声明为String,但实际返回的是Status枚举实例,类型不统一直接导致比较逻辑异常。 - Play框架的模板引擎会将你代码中双引号包裹的
"MODERATED"识别为待解析的变量,而非字符串字面量,因此抛出MODERATED未定义的错误。
解决方案(三种任选即可)
方案1:直接用枚举实例比较(推荐)
首先修正模型层的getter方法,返回正确的枚举类型:
// 修正前错误代码 // public String getStatus() { // return status; // } // 修正后代码 public Status getStatus() { return status; }
然后在模板中直接对应枚举实例做比较,注意替换成你项目中Status枚举的实际包路径:
#{if programComment.getStatus() == com.yourproject.package.Status.MODERATED} <div> ... </div> #{/if}
方案2:调用枚举name方法和字符串字面量比较
如果不想修改getter定义,也可以直接调用枚举的name()方法拿到枚举的字符串名称,用单引号包裹字符串字面量避免模板解析为变量:
#{if programComment.getStatus().name() == 'MODERATED'} <div> ... </div> #{/if}
如果你希望getter始终返回字符串,也可以把getter调整为:
public String getStatus() { return status.name(); }
之后直接用上面的模板代码比较即可。
方案3:用toString方法比较
如果你没有重写Status枚举的toString()方法,默认情况下toString()和name()返回值完全一致,也可以用该方法比较:
#{if programComment.getStatus().toString() == 'MODERATED'} <div> ... </div> #{/if}
内容的提问来源于stack exchange,提问作者asi
相关产品推荐
相关产品推荐

