2

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

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

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

  1. 创建一个新的应用程序
  2. 创建至少一个模型/实体并定义一个 mysql 数据库连接。
  3. 创建一个简单的控制器方法,它只呈现文本(不使用数据库)和相关的路由(比如 /playdbtest)

测试 - 启动应用程序并:

  1. 当数据库可用时调用 playdbtest(应该可以)
  2. 关闭mysql并在数据库关闭时调用playdbtest(将失败)
  3. 禁用/删除实体类并重新开始播放/#2 将起作用

问题:有没有办法规避这种行为或捕获错误?一个应用程序不应该因为它的数据库连接失败而完全失败——尽管它服务请求的能力会受到损害。

谢谢。

4

2 回答 2

1

除了 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);
}
}

玩!例子

于 2012-12-10T07:35:19.183 回答
1

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

您可以自定义错误页面views/errors/500.html

于 2012-12-08T12:23:19.070 回答