在前面的文章中,我们了解了访问请求信息的各种方法(例如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。