想问一下关于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
}
}
错误处理是否在控制器级正常进行?或者服务类是否应该抛出如上所示的异常。请查看并告知我们。
答案 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 ...)对不同的控制器进行编码,以不同方式处理异常。但是,如果该逻辑包含在服务中,那么您在响应不同客户时如何处理服务返回的灵活性就较小。