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