响应结果类JsonResult<E>------控制层的异常操作优化(提取公共部分)
1)响应结果类
- 响应结果类:状态码、状态描述信息、数据封装到一个类中,将这类作为方法返回值,返回给前端浏览器
- Json格式的数据进行响应
- JsonResult
:一个类中有泛型的数据类型时,则声明类的时候也要声明成泛型
- E代表任意的数据类型:泛型
//响应结果类:状态码、状态描述信息、数据封装到一个类中,将这类作为方法返回值,返回给前端浏览器
//Json格式的数据进行响应
public class JsonResult<E> implements Serializable {
private Integer state;//状态码
private String message;//描述信息
private E data;//表示需要被转换成JSON格式的数据对象
//构造方法
public JsonResult() {
}
public JsonResult(Integer state) {
this.state = state;
}
//假设有异常,将异常传递给构造方法
public JsonResult(Throwable e) {
this.message = e.getMessage();
}
public JsonResult(Integer state, E data) {
this.state = state;
this.data = data;
}
//get和set方法
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public E getData() {
return data;
}
public void setData(E data) {
this.data = data;
}
}
2)调用例子
UserController:
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private IUserService userService;
@RequestMapping("/add")
@ResponseBody
public JsonResult<Void> addUser(User user){ //注意这里是Void不是void
JsonResult<Void> result=new JsonResult<>();
try {
userService.addUser(user);
result.setState(200);
result.setMessage("注册成功!");
} catch (UsernameDuplicatedException e) {
result.setState(4000);
result.setMessage("用户名被占用!");
} catch (InsertException e) {
result.setState(5000);
result.setMessage("注册时产生未知的异常!");
}
return result;
}
}
注意:
-
泛型本质是obejct类型 ,是引用类型 ,int等基本类型不是引用类型
-
泛型T不能转为int long 等这些基本类型
-
Void是void对应的包装类java.lang.Void
启动测试:
3)控制层的异常操作优化
在控制层抽取一个父类,在这个父类中统一的去处理异常操作。编写一个BaseController类:统一处理异常
BaseController:
//service层是throw出异常,controller层接收异常
//控制层类的基类,用于控制层异常的捕获处理操作
public class BaseController {
public static final int OK=200; //操作成功的状态码
//可以看作是一个拦截器?
//请求处理方法,这个方法的返回值就是需要传递给前端的数据
//自动将异常对象传递给此方法的参数列表上
//@ExceptionHandler :这个注解用于统一处理抛出异常,当项目中产生了异常,会被统一拦截到此方法中,这个方法此时充当的就是请求处理方法,方法的返回值直接给到前端
@ExceptionHandler(ServiceException.class)
public JsonResult<Void> handleException(Throwable e) {
JsonResult<Void> result = new JsonResult<>(e);
if (e instanceof UsernameDuplicatedException) {
result.setState(4000);
result.setMessage("用户名被占用!");
} else if (e instanceof InsertException) {
result.setState(5000);
result.setMessage("注册时产生未知的异常!");
}
return result;
}
}
UserController:
@RestController
@RequestMapping("/users")
public class UserController extends BaseController{
@Autowired
private IUserService userService;
@RequestMapping("/add")
public JsonResult<Void> addUser(User user){ //注意这里是Void不是void
userService.addUser(user);
return new JsonResult<Void>(OK);
}
}
注意:此处用@RestController。如果用了@Controller+@ResponseBody,插入新用户成功,但是如果用户名相同则服务器没反应,也不会返回异常信息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏