Playframework 如果数据库关闭,所有控制器都会以500失败(播放1.2.5)-我可以覆盖该行为吗?

Playframework 如果数据库关闭,所有控制器都会以500失败(播放1.2.5)-我可以覆盖该行为吗?,playframework,Playframework,这似乎是play 1.2.x中的行为:如果应用程序至少有一个模型/实体,因此依赖JPA,并且数据库连接(mysql)失败(超时或数据库关闭),那么控制器方法在到达方法代码之前失败,甚至出现500个错误,即使该方法不使用数据库 例如,这可以防止编写数据库健康检查控制器方法,或者编写对数据库错误具有一定弹性的方法 我已经用一个简单的项目验证了这一点。复制: 创建一个新的应用程序 至少创建一个模型/实体并定义mysql数据库连接 创建一个简单的控制器方法,它只呈现文本(不使用数据库)和关联的路由(比如

这似乎是play 1.2.x中的行为:如果应用程序至少有一个模型/实体,因此依赖JPA,并且数据库连接(mysql)失败(超时或数据库关闭),那么控制器方法在到达方法代码之前失败,甚至出现500个错误,即使该方法不使用数据库

例如,这可以防止编写数据库健康检查控制器方法,或者编写对数据库错误具有一定弹性的方法

我已经用一个简单的项目验证了这一点。复制:

  • 创建一个新的应用程序
  • 至少创建一个模型/实体并定义mysql数据库连接
  • 创建一个简单的控制器方法,它只呈现文本(不使用数据库)和关联的路由(比如/playdbtest)
  • 要测试-启动应用程序,请执行以下操作:

  • 当数据库可用时调用playdbtest(应该可以工作)
  • 关闭mysql并在数据库关闭时调用playdbtest(将失败)
  • 禁用/删除实体类并重新启动播放/#2将起作用
  • 问题:有没有办法绕过这种行为或抓住错误?应用程序不应该因为数据库连接失败而完全失败,尽管其服务请求的能力将受到损害


    谢谢。

    查看源代码,我发现您可以在不需要DB连接的控制器方法上使用注释
    @NoTransaction


    您可以在
    视图/errors/500.html

    中自定义错误页面。除了samuel的答案,您还可以捕获控制器上的错误

    公共类管理扩展应用程序{
    @Catch(IllegalStateException.class)
    公共静态无效逻辑状态(可丢弃可丢弃){
    Logger.error(“非法状态%s…”,可丢弃);
    }
    公共静态无效索引(){
    List users=User.findAll();
    if(users.size()==0){
    抛出新的IllegalStateException(“无效数据库-0用户”);
    }
    提供(用户);
    }
    }
    

    谢谢!这本来是一个很好的通用解决方案,但不幸的是,只有当异常源于controller方法时,这似乎才起作用。在这种情况下,异常在我们进入控制器方法之前就发生了,并且在没有进入@catch处理程序的情况下仍然失败。嘿,山姆-谢谢!对于我想要实现的特定健康检查,这是一个可能的解决方法。不幸的是,我将不得不依靠JPA以外的东西来测试我的数据库连接,但我认为它可以工作。不过,在更一般的层面上,应用程序仅仅因为JPA无法完成其工作而出错似乎是不对的。事实上,在我看来,应用程序永远不应该显示500个错误,并且始终能够恢复到一定程度,以便向用户显示某些内容。例如,如果数据库不可用,应用程序可能仍然只能在缓存上最低限度地运行,而定制的错误页面是不可接受的解决方案。希望有办法解决这个问题。您还可以自定义/替换处理数据库连接的play
    JPAPlugin
    (并且不会正常失败)。但是,您必须问问自己,Play是否是您心目中的架构的正确框架。