Spring-mvc控制器和异常处理

时间:2012-11-21 06:35:45

标签: java spring spring-mvc

想问一下关于spring-mvc控制器的最佳实践问题。请查看以下代码:

    @Autowired
    SomeService service;

    @RequestMapping (...)
    public @ResponseBody Response createSomething () {

       try {

            serviceResponse = service.doSomething();

            //create a success response and return

       }
       catch (SomeServiceException e) {
             //create an error response and return 
       }

}

错误处理是否在控制器级正常进行?或者服务类是否应该抛出如上所示的异常。请查看并告知我们。

5 个答案:

答案 0 :(得分:7)

我会说根据您的使用情况,您有三种策略。

大致有三种策略:HandlerExceptionResolver, @ExceptionHandler并在行动内部处理异常。

这些用例包括:整个应用程序的常见异常处理程序,整个控制器,相应的特定操作。

答案 1 :(得分:2)

我想说最好的做法是使用@ExceptionHandler。由于在控制器方法中处理异常的缺点是它使代码的可读性降低,并且可能会在许多控制器方法中重复。

我建议为控制器安装一个基类,并定义@ExceptionHandler。这样它就可以用于许多不同的控制器,而不需要任何代码重复。这比异常解析器方法更具可读性,但可以结合使用。

答案 2 :(得分:1)

服务类可以/应该抛出异常..您可以在控制器中处理这些异常以进行日志记录。也可以根据控制器上捕获的异常显示相应的错误页面..但这将是单调乏味的..更好的尝试spring异常处理..http://www.mkyong.com/spring-mvc/spring-mvc-exception-handling-example/

答案 3 :(得分:0)

在Handler类的bean定义文件中定义bean。 当程序中抛出任何异常时,将调用resolveException方法。

  public class Handler
        implements HandlerExceptionResolver
    {

        public Handler()
        {
        }

        public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
        {
            if(ex instanceof ErrorType1Exception))
            {
                 ModelAndView test = new ModelAndView("errorpage1jsppage");
return test;
            } else
            if(ex instanceof ErrorType2Exception))
            {
                 ModelAndView test1 = new ModelAndView("errorpage2jsppage");
return test1
            }
        }
    }

答案 4 :(得分:0)

异常处理的一个好习惯是提早投掷和追赶迟到。在您的情况下,这意味着在控制器而不是服务上捕获错误。这样做的好处是,您可以根据客户端请求(SOAP / REST / JSON ...)对不同的控制器进行编码,以不同方式处理异常。但是,如果该逻辑包含在服务中,那么您在响应不同客户时如何处理服务返回的灵活性就较小。