通用结果类

今天给大家介绍一个我们Java前后端开发项目时常常使用的一个通用结果类

实现代码如下:

/**
 * 通用返回结果,服务端响应的数据最终都会封装成此对象
 * @param <T>
 */
@Data
public class R<T> {
    private Integer code;       //编码:1成功,0和其它数字为失败
    private String msg;         //错误信息
    private T data;             //数据
    private Map map = new HashMap();   //动态数据

    public static <T> R<T> success(T object) {
        R<T> r = new R<T>();
        r.data = object;
        r.code = 1;
        return r;
    }
    public static <T> R<T> error(String msg) {
        R r = new R();
        r.msg = msg;
        r.code = 0;
        return r;
    }
    public R<T> add(String key, Object value) {
        this.map.put(key, value);
        return this;
    }
}

1.解析此类

code: 实际上就是和前端约定好的状态码。

常常200表示成功 400表示执行失败。这里使用1成功,0和其它数字为失败。

例如在success() 中设置code = 1,error()则code = 0

msg:错误信息

在使用error函数中常常设置错误信息返回给前端

data:访问成功时,返回的数据信息。使用了泛型可以根据不同情况,返回不同类型的数据。

在访问成功又不需要返回数据的情况可以将T设置为String类型,然后用作返回访问成功提示信息。

map:动态向结果集中填充一些额外的数据

例如:R.success().add(key,value)函数向其中填充额外数据。

static <T> R<T> success(T object): 静态方法,用于创建R类的实体类对象

R.success(返回的数据对象) 即可返回携带返回数据 设置好状态码的R对象。通过springMVC中的@ResponseBody注解将返回的R对象转化为json类型数据

同理:

static <T> R<T> error(String msg): 静态方法,用于创建R类的实体类对象

R.error(返回的错误信息) 即可返回携带提示信息 设置好状态码的R对象。

add():用于向结果集中添加额外的动态信息。

2.使用实例:

下面是我写登录退出时的使用情景:

@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    @PostMapping("/login")
    public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){

        // 1.将页面提交的密码password进行md5加密处理
        String password = employee.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes());

        // 2.根据页面提交的username查找数据库
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Employee::getUsername,employee.getUsername());
        Employee emp = employeeService.getOne(queryWrapper);
        // 3.如果没有查询到则返回登录失败结果
        if (emp == null){
            return R.error("该用户不存在!");
        }
        // 4.密码对比 不一致则登陆失败
        if (!emp.getPassword().equals(password)){
            return R.error("密码输入有误!");
        }
        // 5.查看员工状态 若已禁用 则返回用户已被禁用
        if (emp.getStatus() == 0){
            return R.error("您的账户已被冻结!");
        }
        // 6.登陆成功,将员工id存入Session并返回登陆成功结果
        request.getSession().setAttribute("employee",emp.getId());
        return R.success(emp);
    }
    @PostMapping("/logout")
    public R<String> logout(HttpServletRequest request){
        request.getSession().removeAttribute("employee");
        return R.success("退出成功!");
    }
}

其中:

// 返回访问错误信息
return R.error("密码输入有误!");
// 返回访问成功 并将登陆成功的成员信息返回到结果集中
return R.success(emp);  
//添加额外动态信息的结果集 
return R.success(emp).add("info","登陆成功!");  

在Java开发中,为了统一接口返回数据格式,通常会设计一个通用果类,用于封装方法执行后的返回果,包括状态码、数据内容、消息等信息。这种设计可以提升代码的可维护性和可读性,同时也有助于前后端分离架构下的数据交互。 ### 通用果类设计 一个通用果类通常包含以下几个核心字段: - `code`:表示请求的状态码,如200表示成功,500表示服务器错误。 - `data`:用于封装返回的具体数据,类型可以是泛型,以适应不同类型的数据。 - `message`:描述请求果的简要信息,例如“success”或“error”。 - `description`:可选字段,用于提供更详细的错误描述或其他附加信息。 以下是一个简单的实现示例: ```java public class Result<T> { private int code; private T data; private String message; private String description; public Result(int code, T data, String message, String description) { this.code = code; this.data = data; this.message = message; this.description = description; } // 成功时的返回 public static <T> Result<T> success(T data) { return new Result<>(200, data, "success", null); } // 失败时的返回 public static <T> Result<T> error(int code, String message, String description) { return new Result<>(code, null, message, description); } // Getter和Setter省略 } ``` 通过上述设计,可以在不同的业务场景中使用该果类来封装返回值,例如在控制器层中返回给前端的响应果: ```java @GetMapping("/user/{id}") public Result<User> getUser(@PathVariable Long id) { User user = userService.findById(id); if (user == null) { return Result.error(404, "User not found", "The requested user does not exist."); } return Result.success(user); } ``` 在实际应用中,可以根据具体需求对果类进行扩展,例如添加时间戳、日志信息等。此外,也可以Spring Boot的`@RestControllerAdvice`来全局处理异常,并返回统一格式的果对象[^3]。 ### 相关问题 1. 如何在Spring Boot中使用`@RestControllerAdvice`实现全局异常处理并返回统一果格式? 2. 通用果类中是否有必要包含`description`字段?其作用是什么? 3. 在设计通用果类时,如何处理不同的HTTP状态码? 4. 泛型在通用果类中的作用是什么?如何正确使用泛型? 5. 除了封装成功与失败的果,通用果类还可以扩展哪些功能?
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值