Java统一结果处理

1、为什么使用统一结果?

大部分前后端项目采用 JSON 格式进行数据交互,定义一个统一的数据规范,有利于前后台的交互、以及信息处理。

2、数据格式?如何处理?代码实现?

(1)数据格式
  是否响应成功(success: true / false)
  响应状态码(code:200 / 400 / 500 等)
  状态码描述(message:访问成功 / 系统异常等)
  响应数据(data:处理的数据)

【输出格式如下所示:】

{
  "success": true,
  "code": 200,
  "message": "查询用户列表",
  "data": {
    "itms": [
      {
        "id": "1",
        "username": "admin",
        "role": "ADMIN",
        "createTime": "2020-4-24T15:32:29",
        "modifiedTime": "2020-4-24T15:41:40"
      },{
        "id": "2",
        "username": "zhangsan",
        "role": "USER",
        "createTime": "2020-4-24T15:32:29",
        "modifiedTime": "2020-4-24T15:41:40"
      }
    ]
  }
}

(2)如何处理?
  success 设置成 Boolean 类型。
  code 设置成 Integer 类型。  
  message 设置成 String 类型。
  data 设置成 HashMap 类型。
  构造器私有,且使用静态方法返回类对象。
  采用链式调用(即方法返回对象为其本身,return this)。
(3)代码实现?
  Step1:创建一个 统一结果处理类 Result 。

【代码实现如下:】

package com.lyh.common.util;

import lombok.Data;
import org.apache.http.HttpStatus;

import java.util.HashMap;
import java.util.Map;

/**
 * 统一结果返回类。方法采用链式调用的写法(即返回类本身 return this)。
 * 构造器私有,不允许进行实例化,但提供静态方法 ok、error 返回一个实例。
 * 静态方法说明:
 *      ok     返回一个 成功操作 的结果(实例对象)。
 *      error  返回一个 失败操作 的结果(实例对象)。
 *
 * 普通方法说明:
 *      success      用于自定义响应是否成功
 *      code         用于自定义响应状态码
 *      message      用于自定义响应消息
 *      data         用于自定义响应数据
 *
 * 依赖信息说明:
 *      此处使用 @Data 注解,需导入 lombok 相关依赖文件。
 *      使用 HttpStatus 的常量表示 响应状态码,需导入 httpcore 相关依赖文件。
 */
@Data
public class Result {
    /**
     * 响应是否成功,true 为成功,false 为失败
     */
    private Boolean success;

    /**
     * 响应状态码, 200 成功,500 系统异常
     */
    private Integer code;

    /**
     * 响应消息
     */
    private String message;

    /**
     * 响应数据
     */
    private Map<String, Object> data = new HashMap<>();

    /**
     * 默认私有构造器
     */
    private Result(){}

    /**
     * 私有自定义构造器
     * @param success 响应是否成功
     * @param code 响应状态码
     * @param message 响应消息
     */
    private Result(Boolean success, Integer code, String message){
        this.success = success;
        this.code = code;
        this.message = message;
    }

    /**
     * 返回一个默认的 成功操作 的结果,默认响应状态码 200
     * @return 成功操作的实例对象
     */
    public static Result ok() {
        return new Result(true, HttpStatus.SC_OK, "success");
    }

    /**
     * 返回一个自定义 成功操作 的结果
     * @param success 响应是否成功
     * @param code 响应状态码
     * @param message 响应消息
     * @return 成功操作的实例对象
     */
    public static Result ok(Boolean success, Integer code, String message) {
        return new Result(success, code, message);
    }

    /**
     * 返回一个默认的 失败操作 的结果,默认响应状态码为 500
     * @return 失败操作的实例对象
     */
    public static Result error() {
        return new Result(false, HttpStatus.SC_INTERNAL_SERVER_ERROR, "error");
    }

    /**
     * 返回一个自定义 失败操作 的结果
     * @param success 响应是否成功
     * @param code 响应状态码
     * @param message 相应消息
     * @return 失败操作的实例对象
     */
    public static Result error(Boolean success, Integer code, String message) {
        return new Result(success, code, message);
    }

    /**
     * 自定义响应是否成功
     * @param success 响应是否成功
     * @return 当前实例对象
     */
    public Result success(Boolean success) {
        this.setSuccess(success);
        return this;
    }

    /**
     * 自定义响应状态码
     * @param code 响应状态码
     * @return 当前实例对象
     */
    public Result code(Integer code) {
        this.setCode(code);
        return this;
    }

    /**
     * 自定义响应消息
     * @param message 响应消息
     * @return 当前实例对象
     */
    public Result message(String message) {
        this.setMessage(message);
        return this;
    }

    /**
     * 自定义响应数据,一次设置一个 map 集合
     * @param map 响应数据
     * @return 当前实例对象
     */
    public Result data(Map<String, Object> map) {
        this.data.putAll(map);
        return this;
    }

    /**
     * 通用设置响应数据,一次设置一个 key - value 键值对
     * @param key 键
     * @param value 数据
     * @return 当前实例对象
     */
    public Result data(String key, Object value) {
        this.data.put(key, value);
        return this;
    }
}

(4)使用:
  修改某个 controller 如下所示:
  若查询用户成功,调用 ok 返回查询到的结果。
  若查询用户失败,调用 error 返回查询失败信息。

@GetMapping("selectOne")
public Result selectOne(Integer id) {
    Emp emp = this.empService.queryById(id);
    if (emp == null) {
        return Result.error().message("用户不存在");
    }
    return Result.ok().data("items", emp).message("查询成功");
}

启动服务并访问:
  测试查询用户不成功的返回结果:

{
    "success": false,
    "code": 500,
    "message": "用户不存在",
    "data": {}
}

测试查询用户成功的返回结果:

{
    "success": true,
    "code": 200,
    "message": "查询成功",
    "data": {
        "items": {
            "id": 1,
            "name": "tom",
            "salary": 6000.0,
            "age": 20,
            "email": "tom@163.com"
        }
    }
}

转载:https://www.cnblogs.com/l-y-h/archive/2020/04/26/12781586.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中可以使用Servlet和Filter来统一处理请求。Servlet是处理HTTP请求的Java,可以通过继承 HttpServlet 实现自定义的 Servlet。Filter是一种过滤器,可以在请求到达 Servlet 之前或之后对请求进行拦截和处理,可以通过实现 Filter 接口来自定义 Filter。 在 Servlet 中,可以通过重写 doGet() 和 doPost() 方法来处理 GET 和 POST 请求,也可以重写其它 HTTP 方法的方法来处理其它型的请求。在 Filter 中,可以通过实现 doFilter() 方法来对请求进行拦截和处理。 以下是一个简单的示例代码,演示了如何使用 Servlet 和 Filter 统一处理请求: ```java // 自定义 Servlet public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 处理 GET 请求 System.out.println("处理 GET 请求"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 处理 POST 请求 System.out.println("处理 POST 请求"); } } // 自定义 Filter public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 拦截请求 System.out.println("拦截请求"); // 继续处理请求 chain.doFilter(request, response); // 处理完请求后的操作 System.out.println("请求处理完成"); } @Override public void destroy() { // 销毁 } } // 配置 Servlet 和 Filter public class MyWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { // 注册 Servlet ServletRegistration.Dynamic myServlet = servletContext.addServlet("myServlet", new MyServlet()); myServlet.addMapping("/myServlet/*"); // 注册 Filter FilterRegistration.Dynamic myFilter = servletContext.addFilter("myFilter", new MyFilter()); myFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); } } ``` 在上述代码中,我们定义了一个自定义的 Servlet 和 Filter,并在 MyWebAppInitializer 中配置了它们的映射关系。当请求到达时,先会经过 MyFilter 进行拦截和处理,然后再交给 MyServlet 进行具体的处理。在 MyFilter 中我们还可以进行一些其它的操作,例如记录日志、设置请求头等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值