Java EE 8 MVC:全局异常处理


在前面的文章中,我们了解了访问请求信息的各种方法(例如query或者path parameters)在Java EE MVC中。这篇文章展示了如何将全局异常处理应用于一个MVC应用程序。

假设我们有一个控制器方法,可能会引发IllegalArgumentException

@Controller
@Path("illegal-argument")
public class ExceptionController {

  @GET
  public String doWork() {
    // code that might throw an IllegalArgumentException
  }

}


我们现在可以添加一个尝试/捕捉阻止到doWork()包装可能引发异常的代码。然而,如果需要应用于多种方法,这种方法就变得乏味了。

在这种情况下,我们可以注册一个全局异常映射器。为此,我们必须创建一个实现泛型的类例外外观接口。

简单的例外外观IllegalArgumentExceptions看起来像这样:

@Provider
public class IllegalArgumentExceptionMapper implements ExceptionMapper<IllegalArgumentException> {

  @Inject
  private Models models;

  @Override
  public Response toResponse(IllegalArgumentException exception) {
    models.put("message", exception.getMessage());

    return Response.status(Response.Status.BAD_REQUEST)
        .entity("/WEB-INF/jsp/error.jsp")
        .build();
  }
}


现在,每当一个IllegalArgumentException从控制器方法中抛出,IllegalArgumentExceptionMapper将用于将异常转换为适当的响应。这里呈现了一个简单的错误视图(error)。

如果你想要一个仿制药例外外观处理所有类型的异常,您只需实现例外外观<例外>。如果你有多个例外外观适合处理抛出异常的实现,最具体的例外外观被使用。

快速摘要

向Java EE MVC应用程序添加全局异常处理非常简单。我们只需要创建一个实现例外外观具有应该处理的异常类型的接口。

完整的示例代码可以在GitHub