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



posted @   卡卡发  阅读(325)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示