这似乎是play 1.2.x中的行为:如果一个应用程序至少有一个模型/实体,因此依赖于JPA,并且数据库连接(mysql)失败(超时或数据库关闭),则控制器方法在到达方法代码之前失败,并出现500错误,即使该方法不使用数据库。
例如,这可以防止编写数据库健康检查控制器方法,或对数据库错误具有一定弹性的方法。
我已经用一个简单的项目验证了这一点。复制:
- 创建新应用程序
- 至少创建一个模型/实体,并定义一个mysql数据库连接
- 创建一个简单的控制器方法,只渲染文本(不使用数据库)和相关的路由(比如/playdbtest)
要测试-启动应用程序并:
- 当数据库可用时调用playdbtest(应该可以工作)
- 关闭mysql并在数据库关闭时调用playdbtest(将失败)
- 禁用/删除实体类并重新开始播放/#2将起作用
问题:有没有办法规避这种行为或发现错误?应用程序不应该因为数据库连接失败而完全失败,尽管它为请求提供服务的能力会受到损害。
谢谢。
查看源代码,我发现您可以在不需要DB连接的控制器方法上使用注释@NoTransaction
。
您可以在views/errors/500.html
中自定义错误页面。
除了samuel的答案,您还可以捕获控制器上的错误。
public class Admin extends Application {
@Catch(IllegalStateException.class)
public static void logIllegalState(Throwable throwable) {
Logger.error("Illegal state %s…", throwable);
}
public static void index() {
List<User> users = User.findAll();
if (users.size() == 0) {
throw new IllegalStateException("Invalid database - 0 users");
}
render(users);
}
}
玩!示例