2016-10-03 73 views
2

我通过Spring exception handling documentation去了,我没把握好主意如何处理AJAX调用未处理产生的异常。页和Ajax调用春季异常处理

什么是处理这两种页面请求未处理的异常和AJAX调用未处理的异常在一个应用程序方便易方法?

这可能是一个问题,因为全球性的异常处理程序也搭上Ajax调用,并与很多东西返回“专用错误页面”,从而防止了Ajax错误回调带来苗条的错误答复。

+0

AJAX调用可以是一个REST调用,但我相信你的意思是页面请求与AJAX请求。我不明白问题1.由于您知道如何编写异常处理程序,因此我不确定问题2背后的意图。 – zeroflagL

回答

1

有休息控制器异常处理的方式有三种:

注释与@ResponseStatus和适当的HTTP结果代码的异常给定异常被抛出时,应当返还。

例如,如果PersonNotFoundExcepition被抛出,返回HTTP 404客户端(未找到)

@ResponseStatus(HttpStatus.NOT_FOUND) 
public class PersonNotFoundException { … } 

另一种方法是在你的控制器@ExceptionHandler注释的方法。在@ExceptionHandler注解的值中,您可以定义应该捕获哪些异常。此外,您可以在同一个方法上添加@ResponseStatus注释来定义应将哪个HTTP结果代码返回给客户端。

@ResponseStatus(HttpStatus.NOT_FOUND) 
@ExceptionHandler({PersonNotFoundException.class}) 
public void handlePersonNotFound() { 
    ... 
} 

优选的方法:实施ResponseEntityExceptionHandler接口作为@ControllerAdvice。通过这种方式,您可以将异常处理逻辑应用于具有集中异常处理的所有控制器您可以在教程here中阅读更多内容。

@ControllerAdvice 
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { 
    ... 
    @Override 
    protected ResponseEntity<Object> handleHttpMediaTypeNotSupported(HttpMediaTypeNotSupportedException ex, HttpHeaders headers, HttpStatus status, WebRequest request) { 
     String unsupported = "Unsupported content type: " + ex.getContentType(); 
     String supported = "Supported content types: " + MediaType.toString(ex.getSupportedMediaTypes()); 
     ErrorMessage errorMessage = new ErrorMessage(unsupported, supported); 
     return new ResponseEntity(errorMessage, headers, status); 
    } 
    ... 
} 

注意,你不应该对所有类型的异常返回通用500 - Internal server error。一般而言,您希望针对客户端错误具有400个范围的结果 - 错误的请求。 500s的结果代码范围到服务器端的错误。此外,根据所发生的事情而不是仅仅400或500返回更具体的代码会更好。

+0

“@ ControllerAdvice”如何与“@ Controller”映射。控制器中的异常如何映射到异常? –

+1

它由所有的控制器共享,它不是每个控制器,所以你可以有集中的异常处理。基于异常类型(输入参数)将适当的方法称为自动检测。 –

0

我接触到解决方案时使用请求标头在全局异常处理程序中拆分ajax调用和序号页面请求。对于ajax无效的用户输入类型的异常和内部服务器错误,也有不同的错误响应。

... 
public class Application extends SpringBootServletInitializer { 

@Bean(name = "simpleMappingExceptionResolver") 
public SimpleMappingExceptionResolver createSimpleMappingExceptionResolver() { 
    SimpleMappingExceptionResolver r = new SimpleMappingExceptionResolver(); 
    r.setDefaultErrorView("forward:/errorController"); 
    return r; 
} 

@Controller 
public class ErrorController { 

    public static final Logger LOG = Logger.getLogger(ErrorController.class); 

    @RequestMapping(value = "/errorController") 
    public ModelAndView handleError(HttpServletRequest request, 
      @RequestAttribute("exception") Throwable th) { 

     ModelAndView mv = null; 
     if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) { 
      if (isBusinessException(th)) { 
       mv = new ModelAndView("appAjaxBadRequest"); 
       mv.setStatus(BAD_REQUEST); 
      } else { 
       LOG.error("Internal server error while processing AJAX call.", th); 
       mv = new ModelAndView("appAjaxInternalServerError"); 
       mv.setStatus(INTERNAL_SERVER_ERROR); 
      } 
      mv.addObject("message", getUserFriendlyErrorMessage(th).replaceAll("\r?\n", "<br/>")); 
     } else { 
      LOG.error("Cannot process http request.", th); 
      mv = new ModelAndView("appErrorPage"); 
      mv.addObject("exeption", th); 
     } 

     return mv; 
    } 
}