springboot 实战:异常与重定向问题
作者:Yangkx-123 发布时间:2022-03-06 15:44:54
springboot 异常与重定向
在spring中,有两个重定向类型:
301,永久性跳转
302,暂时性跳转
默认调用302。
1.下面先通过一个简单的例子实现页面的重定向
@RequestMapping("/redirect/[code]")
public RedirectView redirectView(@PathVariable("code") int code,
HttpSession session){
RedirectView red = new RedirectView("/",true);
//判断是不是301异常
if (code == 301){
//默认为302转移,此处设置为永久性转移
red.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
}
return red;
}
结果:
无论是访问“redirect/301”还是“redirect/302”,结果都会跳转到首页,只是一个是301类型,一个是302类型。
2.通过一个更简单的方法实现重定向
@RequestMapping("/redirect/[code]")
public RedirectView redirectView(@PathVariable("code") int code,
HttpSession session){
//这种跳转都是302跳转,通过一个redirect前缀告诉请求,要跳转到首页
//所有的redirect请求都会跳转到首页
return "redirect:/";
}
结果:
这种方式重定向,都是通过302的方式进行的,无论“redirect”后面的url是什么,因为只要识别到redirect这个前缀,就会跳转到首页。
3.在重定向过程中,用session传递信息
1.重定向页面
@RequestMapping("/redirect/[code]")
public String redirectView(@PathVariable("code") int code,
HttpSession session){
//这种跳转都是302跳转,通过一个redirect前缀告诉请求,要跳转到首页
//所有的redirect请求都会跳转到首页
//通过session来传递信息
session.setAttribute("msg","Jump from redirect");
return "redirect:/";
}
2.首页
@RequestMapping("/")
@ResponseBody
public String index(HttpSession session){
//在首页中显示重定向中的session
return "Hello World!" + session.getAttribute("msg");
}
结果:
无论redirect后面的url是什么,都会返回首页,并显示相应的信息。
4.admin请求异常
@RequestMapping("/admin")
@ResponseBody
public String admin(@RequestParam("key") String key){
//如果key=“admin”
if ("admin".equals(key)){
return "hello admin";
}
//否则抛出异常
throw new IllegalArgumentException("Key Wrong!");
}
结果:
在“key=admin”的时候,返回相应信息;在“key!=admin”的时候,返回错误信息。
5.自己定义异常
@ExceptionHandler()
@ResponseBody
public String error(Exception e){
return "error:" + e.getMessage();
}
结果:
可以看出,在出现异常的时候,使我们自己定义的异常界面内容,和4中的不同。
springboot 异常统一处理
这里先对需要使用到的注解或者类进行说明,顺便理清楚条理。
@ExceptionHandler:注解使用在方法上,值为指定某个异常,当该方法所在的controller出现的异常与注解的异常对应,则会触发注解的方法。
下面这个controller一旦出现异常都会将异常捕获转给该方法进行处理
@RestController
@RequestMapping("user")
public class UserController {
@ExceptionHandler(value = Exception.class)
public void solveException(){
//异常处理逻辑
}
}
@controllerAdvice: 注解在类上,注解的类会注册到spring容器中,类中可有三种注解,@ExceptionHandler,@InitBinder,@ModelAttribute。该类下只要是注解上面三个注解的方法就是让把方法应用到程序中所有带有@RequesMapping注解的方法上。
流程 :
自定义一个自己的异常
声明带有@ControllerAdvice的类和@ExceptionHandler的方法,将@ExceptionHandler的方法应用到所有controller。
声明一个返回结果类
声明一个枚举类,用来包含可能出现的异常类型
Demo
自定义异常:
@Data
@AllArgsConstructor
public class MyException extends RuntimeException{
private Integer code;
private String msg;
public MyException(ResultEnum resultEnum){
this.msg = resultEnum.getMsg();
this.code = resultEnum.getCode();
}
}
自定义返回结果:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result {
private int code;
private String msg;
}
枚举类:
public enum ResultEnum {
UNKNOW_ERROR(-1,"未知错误"),
USER_ERROR(-2,"用户信息错误"),
SUCCESS(0,"成功");
private Integer code;
private String msg;
ResultEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
//省略getter和setter
}
工具类:
public class ResultUtil {
public static Result error(Integer code, String msg) {
Result result = new Result();
result.setCode(code);
result.setMsg(msg);
return result;
}
}
自定义异常捕获类:
@ControllerAdvice
@Slf4j
public class MyExceptionHandler {
//接收的是Exception,也就是只要是异常都会执行这方法
@ExceptionHandler(value=Exception.class)
@ResponseBody
public Result handle(Exception e){
if(e instanceof MyException){
MyException myException = (MyException) e;
return ResultUtil.error(myException.getCode(),myException.getMsg());
}else{
return ResultUtil.error(-1,"未知错误");
}
}
}
controller类:
@RestController
@RequestMapping("user")
public class UserController {
@GetMapping("exception")
public void catchException() throws Exception{
throw new MyException(ResultEnum.USER_ERROR);
}
}
流程:
我们访问http://localhost:8080/user/exception来访问该方法,并抛出我们自定义的异常,通过枚举类来进行对异常信息的集合。
通过自定义的异常捕获类,来进行对异常的捕获,执行方法。
异常捕获类的方法中,通过ResultUtil工具类来进行生成Result对象返回。
来源:https://blog.csdn.net/yang_csdnForOBTS/article/details/81981185
猜你喜欢
- 这篇文章主要介绍了通过实例解析JMM和Volatile底层原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 同步代码块基本语句synchronized (任意对象) {操作共享代码}代码示例public class SellTicket imple
- 这篇文章主要介绍了简单了解Java多态向上转型相关原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 前言:在纯 Java 代码里 我们一般都会用class.getResource(String name) 或者 class.getClass
- (注意:本文基于JDK1.8) 前言包括迭代器中的remove()方法,以及删除单个元素、删除多个元素、删除所有元素、删除不包含的
- 1. 前言ResultSetMetaData 叫元数据,是数据库 列对象,以列为单位封装为对象。元数据,指的是其包含列名,列值,列类型,列长
- 类必须先定义才能使用。类是创建对象的模板,创建对象也叫类的实例化。下面通过一个简单的例子来理解Java中类的定义:public class
- What内含一个或多个maven模块的SpringBoot项目称为SpringBoot多模块项目Why便于维护 将一个大的单体项目分成多个子
- 介绍: Mybatis-Plus(简称MP)
- 一、返回BufferedImage由于spring mvc不支持返回BufferedImage ,所以增加图片转换器@Configurati
- 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很
- 标准c++中string类函数介绍注意不是CString之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者
- 本文实例讲述了java内部类原理与用法。分享给大家供大家参考,具体如下:概念内部类:可以包含在另外一个类中的类外部类:包含内部类的类每个内部
- shiro是一个权限框架,具体的使用可以查看其官网 http://shiro.apache.org/ 它提供了很方便的权限认证和
- 单选题:(每道题目2分)1. 下列哪个声明是错误的?(B) A. int i=10;B. float f=1.1;&
- 创建类模式主要关注对象的创建过程,将对象的创建过程进行封装,使客户端可以直接得到对象,而不用去关心如何创建对象。创建类模式有5种,分别是:
- 简介石头剪刀布游戏,进入游戏后,玩家需要输入玩家姓名。系统界面之后弹出欢迎界面,玩家可以选择出拳或者退出游戏。玩家选择出拳后同电脑出拳比较,
- ArrayList中存放引用数据类型ArrayList中存放引用类型时,存放的是一个引用,因此在放入ArrayList之后再进行改动会影响到
- Java中代码的加载顺序所能了解的知识点类的依赖关系static代码块的加载时间继承类中构造器的隐式调用非static的成员变量初始化时间m
- 本文提供了基于MD5加密16位和32位的方法,具体内容如下import java.io.IOException;import java.ma