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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。