响应结果类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号
浙公网安备 33010602011771号