响应结果类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,插入新用户成功,但是如果用户名相同则服务器没反应,也不会返回异常信息。
浙公网安备 33010602011771号