Play Framework 2.6.2中Java控制器Flash值无法传递到Scala视图的问题
问题原因
Play框架的Flash作用域数据绑定在单次请求生命周期中,你没有将请求对象传递到视图层,导致视图无法读取到请求中携带的Flash值。
解决方案步骤
1. 修改Java控制器代码
调整viewAccount方法,接收Http.Request参数,并在渲染视图时传入该参数:
import play.mvc.Http; // Play会自动注入当前请求到方法的Http.Request参数 public Result viewAccount(final Http.Request request, final String accountNo) { return ok( ViewAccount.render( accountNo, request // 将请求对象传递给视图 ) ); } // adjustment方法原有逻辑无需修改 public Result adjustment(final String accountNo) { try { // 原有业务逻辑保留 flash("success", "Successfully updated account."); } catch (NumberFormatException e) { flash("error", "Could not update the account"); } return redirect(routes.AccountsController.viewAccount(accountNo)); }
2. 修改Scala视图的参数声明
在ViewAccount.scala.html文件第一行的参数列表末尾添加隐式request参数,假设原有视图只接收accountNo参数,修改后如下:
@(accountNo: String)(implicit request: Http.Request)
3. 调整视图中Flash值的读取逻辑
直接从request对象中读取flash值即可,完整代码如下:
@if(request.flash.get("success").isPresent) { <div class="alert alert-success" role="alert"> <b>操作成功:</b> @request.flash.get("success").get() <button type="button" class="close" data-dismiss="alert"><span>×</span></button> </div> } @if(request.flash.get("error").isPresent) { <div class="alert alert-danger" role="alert"> <b>操作失败:</b> @request.flash.get("error").get() <button type="button" class="close" data-dismiss="alert"><span>×</span></button> </div> }
补充说明
Play 2.8及以上版本完全兼容上述写法,无需额外修改路由配置,框架会自动完成请求参数的注入。
内容的提问来源于stack exchange,提问作者malkier11
相关产品推荐
相关产品推荐

