springmvc常见问题,springmvc解决了什么问题

  springmvc常见问题,springmvc解决了什么问题

  春天统一异常处理有3种方式,分别为:

  使用@ ExceptionHandler注解、实现处理器异常解析器接口、使用@controlleradvice注解

  

  写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用

  使用 @ ExceptionHandler 注解

  使用该注解有一个不好的地方就是:进行异常处理的方法必须与出错的方法在同一个控制器里面。使用如下:

  @控制器

  公共类全局控制器{

  /**

  * 用于处理异常的

  * @返回

  */

  @异常处理程序({我的异常。class })

  公共字符串异常(MyException e) {

  系统。出去。println(e . getmessage());

  e。printstacktrace();

  返回"异常";

  }

  @RequestMapping(test )

  公共无效测试(){

  抛出新的MyException(出错了!);

  }

  }可以看到,这种方式最大的缺陷就是不能全局控制异常。每个类都要写一遍。

  实现处理器异常解析器接口

  这种方式可以进行全局的异常控制。例如:

  @组件

  公共类例外测试实现HandlerExceptionResolver{

  /**

  * TODO简单描述该方法的实现功能(可选).

  * @见org。spring框架。网络。servlet。handlerexception resolver #解决异常(javax。servlet。http。http servlet请求。servlet。http。http servlet响应,java.lang.Object,java.lang.Exception)

  */

  public ModelAndView解决异常(http servlet请求请求,HttpServletResponse响应,对象处理程序,

  例外例如){

  这是异常处理程序方法!);

  返回空

  }

  }使用 @ControllerAdvice+ @ ExceptionHandler 注解

  上文说到@ ExceptionHandler需要进行异常处理的方法必须与出错的方法在同一个控制器里面。那么当代码加入了@ControllerAdvice,则不需要必须在同一个控制器中了。这也是春天3.2带来的新特性。从名字上可以看出大体意思是控制器增强。也就是说,@控制器建议@异常处理程序也可以实现全局的异常捕捉。

  请确保此WebExceptionHandle类能被扫描到并装载进春天容器中。

  @ControllerAdvice

  @ResponseBody

  公共类WebExceptionHandle {

  私有静态记录器记录器=记录器工厂。获取记录器(webexception句柄。类);

  /**

  * 400 -错误的请求

  */

  @ResponseStatus(HttpStatus .错误请求)

  @异常处理程序(httpmessageneraterableexception。类)

  公共服务响应handlehttpmessagenoretreadableexception(httpmessagenoretreadableexception e){

  logger.error(参数解析失败,e);

  returnserviceresponsehandle。失败( could _ not _ read _ JSON );

  }

  /**

  * 405 -不允许使用方法

  */

  @ResponseStatus(HttpStatus .方法_不允许)

  @异常处理程序(http requestmethodnotsupportedexception。类)

  公共服务响应handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e){

  logger.error(不支持当前请求方法,e);

  returnserviceresponsehandle。失败(“request _ method _ not _ supported”);

  }

  /**

  * 415 -不支持的媒体类型

  */

  @ResponseStatus(HttpStatus .不支持的媒体类型)

  @异常处理程序(http mediatypenotsupportedexception。类)

  公共服务响应handleHttpMediaTypeNotSupportedException(异常e) {

  logger.error(不支持当前媒体类型,e);

  returnserviceresponsehandle。失败( content _ type _ not _ supported );

  }

  /**

  * 500 -内部服务器错误

  */

  @ResponseStatus(HttpStatus .内部服务器错误)

  @异常处理程序(异常。类)

  公共服务响应句柄异常(异常e) {

  商业异常的实例){

  returnserviceresponsehandle。失败( BUSINESS _ ERROR ,e . getmessage());

  }

  logger.error(服务运行异常,e);

  e。printstacktrace();

  returnserviceresponsehandle。失败(“server _ error”);

  }

  }如果@ExceptionHandler注解中未声明要处理的异常类型,则默认为参数列表中的异常类型。所以还可以写成这样:

  @ControllerAdvice

  公共类GlobalExceptionHandler {

  @ExceptionHandler()

  @ResponseBody

  字符串句柄异常(异常e){

  返回"例外交易!"e . getmessage();

  }

  }参数对象就是控制器层抛出的异常对象!

  继承ResponseEntityExceptionHandler类来实现针对休息接口的全局异常捕获,并且可以返回自定义格式:

  @Slf4j

  @ControllerAdvice

  公共类ExceptionHandlerBean扩展了ResponseEntityExceptionHandler {

  /**

  * 数据找不到异常

  * @param ex

  * @param请求

  * @返回

  * @抛出异常

  */

  @异常处理程序({ datanotfoundexception。class })

  公共响应实体对象handleDataNotFoundException(运行时异常ex,WebRequest请求)引发IOException {

  return getResponseEntity(ex,request,ReturnStatusCode .DataNotFoundException);

  }

  /**

  * 根据各种异常构建响应度实体。服务于以上各种异常

  * @param ex

  * @param请求

  * @ param specificException

  * @返回

  */

  私有响应实体对象getresponse实体(运行时异常ex,WebRequest请求,ReturnStatusCode特定异常){

  返回模板return template=new return template();

  返回模板。setstatuscode(特定异常);

  返回模板。设置错误消息(例如getmessage());

  return handleExceptionInternal(ex,returnTemplate,

  新的HttpHeaders(),HttpStatus .好的,请求);

  }

  }以上就是的实现异常统一处理的三种方式的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: