简化控制器中的异常捕获

时间:2011-11-12 19:21:04

标签: spring-mvc controller try-catch

我正在使用Spring MVC制作Web服务。控制器由用户直接调用(通过调度程序servlet),响应作为JSON返回。我认为通过注释使用控制器非常方便,但我发现在每个控制器中捕获异常都很无聊。异常总是相同的,并且每个异常的响应也是相同的,所以我可以定义如何只捕获它们一次而不是每个控制器吗? 我在考虑像过滤器这样的东西,但也许这不是一个好主意......任何提示?

现在我的控制器看起来像这样:

@Controller
@RequestMapping("/do")
@PreAuthorize("hasRole('ROLE_USER')") 
public class UselessController {

@SuppressWarnings("rawtypes")
@RequestMapping(value = "/foo", method = RequestMethod.GET)
@PreAuthorize("#bar == principal.bar")
public ResponseEntity foo(@RequestParam int bar) {

    try {
        //do something
    } catch (SomeTypeOfException stExc) {
        return new ResponseEntity(HttpStatus.FORBIDDEN);
    } catch (NoResultException nrExc) {
        return new ResponseEntity(HttpStatus.PRECONDITION_FAILED);
    } catch (Exception exc) {
        return new ResponseEntity(HttpStatus.METHOD_FAILURE);
    }

    return new ResponseEntity(HttpStatus.OK);
}

1 个答案:

答案 0 :(得分:4)

您要找的是HandlerExceptionResolver。如果您只需要一个简单的解决方案来处理大多数常见异常,请实现接口(还有一些现成的实现,请参阅文档中的“所有已知的实现类”)并将其注释为组件,以便在启动时获取它准备时间(至少我不记得曾经需要单独“注册”它或类似的东西)。如果你需要更细粒度的控制,你可以使用你自己的HandlerExceptionResolver中的代码,或创建一个SimpleMappingExceptionResolver来将不同的异常映射到他们自己的错误视图,这通常是通过xml-configs完成的。