You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>&times;</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>&times;</span></button>
    </div>
}
补充说明

Play 2.8及以上版本完全兼容上述写法,无需额外修改路由配置,框架会自动完成请求参数的注入。

内容的提问来源于stack exchange,提问作者malkier11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:06:03