Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring mvc控制器和异常处理_Java_Spring_Spring Mvc - Fatal编程技术网

Java Spring mvc控制器和异常处理

Java Spring mvc控制器和异常处理,java,spring,spring-mvc,Java,Spring,Spring Mvc,我想问您一个关于SpringMVC控制器的最佳实践问题。请查看以下代码: @Autowired SomeService service; @RequestMapping (...) public @ResponseBody Response createSomething () { try { serviceResponse = service.doSomething(); //create a

我想问您一个关于SpringMVC控制器的最佳实践问题。请查看以下代码:

    @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 
       }

}

错误处理是在控制器级别进行的吗?或者服务类不应该抛出如上所示的异常。请检查并让我知道。

服务类可以/应该引发异常。。您可以在控制器中处理这些异常以进行日志记录。您还可以根据控制器上捕获的异常显示相应的错误页。但这将非常繁琐。。最好尝试spring异常处理。。http://www.mkyong.com/spring-mvc/spring-mvc-exception-handling-example/

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


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

我想说,根据您的用例,您有三种策略

大致有三种策略:在操作内部处理异常


这些用例是:整个应用程序的公共异常处理程序、整个控制器、相应的特定操作

在处理程序类的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
            }
        }
    }

异常处理的一个良好实践是早抛出晚捕获。在您的情况下,这意味着在控制器而不是服务上捕获错误。这里的优点是,您可以根据客户机请求(SOAP/REST/JSON…)编写不同的控制器,以不同的方式处理异常。但是,如果服务中存在这种逻辑,那么在您对不同客户的响应中,您在如何处理服务返回方面就没有那么大的灵活性。

Rajesh:我不会从这个控制器返回视图。我返回一个json/ResponseBody,因此没有显示错误页面。但是,我喜欢您的建议,即使用@ExceptionHandler而不是使用try-and-catch块。这样行吗?感谢您并感谢您的回复。Khush..您可以在controller中捕获异常并发送相应的错误消息作为json结果,并在屏幕上相应地显示..这是在一些小情况下完成的..但也要引入此异常处理程序,如果是ajax,您将获得errorpage.html作为ajax响应..然后您可以在屏幕上的div或iframe..如果你喜欢答案,请投票,这样我就可以得到一些分数:)所有这些处理程序都只与SpringMVC关联,对吗?我的意思是,我可以处理来自筛选器或控制器范围之外的任何意外异常吗?因为根据doc,它说Spring
HandlerExceptionResolver
实现处理控制器执行期间发生的意外异常,即控制器执行期间,我使用Spring boot和Spring cloud,智能路由在此发生。因此不涉及Spring MVC。处理全局级异常的最佳方法是什么?基于AOP的解决方案?