现在的开发模式倾向于前后端分离,当服务器或业务服务出现异常时,后端开发人员要友好的返回对应的错误代码和异常信息给前端,本文针对上节的代码进行整改。
上篇笔记:https://blog.youkuaiyun.com/wdg2333/article/details/86764380
一、自定义业务异常 BussinessException.java:
package com.wdg.springdatajpademo.exception;
/**
* @author WDG
* 自定义异常
* @date 2019-2-5
*/
public class BussinessException extends Exception {
private int errCode;//错误代码
private String errMessage;//错误信息
public BussinessException(int errCode, String errMessage) {
this.errCode = errCode;
this.errMessage = errMessage;
}
public int getErrCode() {
return errCode;
}
public void setErrCode(int errCode) {
this.errCode = errCode;
}
public String getErrMessage() {
return errMessage;
}
public BussinessException() {
}
}
二、自定义通用返回码实体类,分页结果实体类,通用信息返回实体类:
ReturnCode.java:
package com.wdg.springdatajpademo.common;
/**
* @author WDG
* @date 2019-2-5
* 返回码定义实体类
*/
public class ReturnCode {
public static final int DEFAULT_ERROR = 10000;//默认错误返回码
public static final int DEFAULT_SUCESS = 11000;//默认成功返回码
//自定义2开头为用户服务返回码
public static final int USER_OPTION_SUCESS = 20001;//用户请求成功返回码
public static final int NO_PERMISSION = 30001;//没有操作权限
}
PageResult.java:
package com.wdg.springdatajpademo.common;
/**
* @author WDG
* 分页返回结果实体类
* @date 2019-2-5
*/
public class PageResult {
private long total;//总记录数
private int totalPage;//查询总页数
private Object data;//结果集
public PageResult(long total, int totalPage, Object data) {
this.total = total;
this.totalPage = totalPage;
this.data = data;
}
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
CommonReturnType.java:
package com.wdg.springdatajpademo.common;
/**
* @author WDG
* 通用结果返回实体类
* @date 2019-2-5
*/
public class CommonReturnType {
private int code;//返回代码
private String message;//结果信息
private Object data;//结果集
public CommonReturnType(int code, String message, Object data) {
this.code = code;
this.message = message;
this.data = data;
}
public CommonReturnType(int code, String message) {
this.code = code;
this.message = message;
this.data = null;
}
public CommonReturnType() {
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
三、全局异常处理器:用到两个注解
@ControllerAdvice、@ExceptionHandler(Exception.class) 可以作用于类上也可以作用于某个方法上
BaseControllerException.java:
package com.wdg.springdatajpademo.controller;
import com.wdg.springdatajpademo.common.CommonReturnType;
import com.wdg.springdatajpademo.common.ReturnCode;
import com.wdg.springdatajpademo.exception.BussinessException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author WDG
* @date 2019-2-5
*/
@ControllerAdvice
public class BaseControllerException {
@ExceptionHandler(Exception.class)
@ResponseBody
public CommonReturnType doExcetion(Exception e){
//判断是否是自定义的业务异常
if(e instanceof BussinessException){
BussinessException exception = (BussinessException) e;
return new CommonReturnType(exception.getErrCode(),exception.getErrMessage());
}else{
//服务器错误
return new CommonReturnType(ReturnCode.DEFAULT_ERROR,"未知错误");
}
}
}
UserController.java:
package com.wdg.springdatajpademo.controller;
import com.wdg.springdatajpademo.common.CommonReturnType;
import com.wdg.springdatajpademo.common.PageResult;
import com.wdg.springdatajpademo.common.ReturnCode;
import com.wdg.springdatajpademo.pojo.User;
import com.wdg.springdatajpademo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;
/**
* @author WDG
* @date 2019-2-4
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 分页查询
* @param page
* @param size
* @return
*/
@GetMapping("/page/{page}/{size}")
public CommonReturnType findByPage(@PathVariable Integer page,@PathVariable Integer size){
Page<User> pageResult = userService.findByPage(page, size);
return new CommonReturnType(ReturnCode.DEFAULT_SUCESS,"查询成功",
new PageResult(pageResult.getTotalElements(),pageResult.getTotalPages(),pageResult.getContent()));
}
/**
* id查询用户
* @param userId
* @return
*/
@GetMapping("/{userId}")
public CommonReturnType findByUserId(@PathVariable Integer userId){
int i = 1/0;
return new CommonReturnType(ReturnCode.DEFAULT_SUCESS,"查询成功",userService.findById(userId));
}
/**
* 注册用户
* @param user
* @return
*/
@PostMapping("/addUser")
public CommonReturnType addUser(@RequestBody User user){
userService.addUser(user);
return new CommonReturnType(ReturnCode.USER_OPTION_SUCESS,"注册成功");
}
/**
* 分页+条件查询
* @param page
* @param size
* @param user
* @return
*/
@PostMapping("/pageandselect/{page}/{size}")
public CommonReturnType findByPageAndSelect(@PathVariable Integer page,
@PathVariable Integer size,
@RequestBody User user){
Page<User> pageResult = userService.findByPageAndSelect(page, size, user);
return new CommonReturnType(ReturnCode.DEFAULT_SUCESS,"查询成功",
new PageResult(pageResult.getTotalElements(),pageResult.getTotalPages(),pageResult.getContent()));
}
/**
* 修改用户
* @param user
* @return
*/
@PutMapping("/updateUser")
public CommonReturnType updateUser(@RequestBody User user){
userService.updateUser(user);
return new CommonReturnType(ReturnCode.USER_OPTION_SUCESS,"修改成功");
}
/**
* 删除用户
* @param userId
* @return
*/
@DeleteMapping("/deleteUser/{userId}")
public CommonReturnType deleteUser(@PathVariable Integer userId,String role) throws Exception{
userService.deleteUser(userId,role);
return new CommonReturnType(ReturnCode.USER_OPTION_SUCESS,"删除成功");
}
/**
* 根据用户名修改用户
* @param user
* @return
*/
@PutMapping("/updateUserByName")
public CommonReturnType updateUserByName(@RequestBody User user){
userService.updateUserByName(user);
return new CommonReturnType(ReturnCode.USER_OPTION_SUCESS,"修改成功");
}
/**
* 根据年龄查询用户信息
* @param age
* @return
*/
@GetMapping("/findUserByAge/{age}")
public CommonReturnType findUserByAge(@PathVariable Integer age){
return new CommonReturnType(ReturnCode.DEFAULT_SUCESS,"查询成功",userService.findUserByAge(age));
}
}
UserService.java 部分代码:
/**
* 删除用户
* @param userId
*/
public void deleteUser(int userId,String role) throws Exception{
//删除用户通常需要超级管理员权限+token验证机制,这边简单判断
if(role !=null && role.equals("admin")){
//是管理员操作
userRepository.deleteById(userId);
}else {
throw new BussinessException(ReturnCode.NO_PERMISSION,"无权操作");
}
}
四、postman进行测试