Springboot-Result风格接口

定义返回数据模型

@Getter
public class Result<T> {

    private T data;

    private String msg;

    private int code;

    private long timestamp = System.currentTimeMillis();

    public Result(T data) {
        this.data = data;
        this.code = ErrorCodeEnum.OK.getCode();
        this.msg = ErrorCodeEnum.OK.getMsg();
    }

    public Result(ErrorCodeEnum codeEnum) {
        this.code = codeEnum.getCode();
        this.msg = codeEnum.getMsg();
    }

    public Result(T data, ErrorCodeEnum codeEnum) {
        this.data = data;
        this.code = codeEnum.getCode();
        this.msg = codeEnum.getMsg();
    }

    public Result(ErrorCodeEnum codeEnum, String msg) {
        this.code = codeEnum.getCode();
        this.msg = codeEnum.getMsg();
        if (!StringUtils.isEmpty(msg)) {
            this.msg = msg;
        }
    }

}

定义返回数据编码(枚举类)

@Getter
public enum ErrorCodeEnum {
    FAIL(-1, "未处理异常"),
    OK(1, "ok"),
    RPC_FAIL(2, "rpc接口请求失败");
	.......

    private int code;
    private String msg;

    ErrorCodeEnum(int code, String msg) {
        this.msg = msg;
        this.code = code;
    }

}

定义异常数据模型

public class AppException extends RuntimeException {

    private ErrorCodeEnum codeEnum;

    public AppException(ErrorCodeEnum codeEnum) {
        super();
        this.codeEnum = codeEnum;
    }

    public AppException(ErrorCodeEnum codeEnum, String message) {
        super(message);
        this.codeEnum = codeEnum;
    }

    public ErrorCodeEnum getCodeEnum() {
        return codeEnum;
    }

}

编写自定义的控制器增强器

@Slf4j
@ControllerAdvice
public class AppResponseBodyHandler implements ResponseBodyAdvice<Object> {
	
	
	//定义不走控制器增强器的返回类型
    private static final List<Class<?>> notSupports = Arrays.asList(String.class, void.class, Result.class, ServletResponse.class, ResponseEntity.class);

    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        Class<?> parameterType = methodParameter.getParameterType();
        if (notSupports.contains(parameterType)) {
            return false;
        }
        return true;
    }
	
	//封装返回数据
    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        if (o != null) {
            return new Result<>(o);
        }
        return null;
    }

	
    // 全局异常捕捉处理
    @ResponseBody
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(value = Throwable.class)
    public Result errorHandler(Throwable e) {
        log.error(e.toString(), e);
        return new Result(FAIL, e.getMessage());
    }


    // 全局异常捕捉处理-自定义异常类
    @ResponseBody
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(value = AppException.class)
    public Result errorHandler(AppException e) {
        log.error(e.toString(), e);
        return new Result(e.getCodeEnum(), e.getMessage());
    }


    // 全局异常捕捉处理-参数验证异常
    @ResponseBody
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public Result allExceptionHandler(MethodArgumentNotValidException e) {
        MethodArgumentNotValidException ex = (MethodArgumentNotValidException) e;
        BindingResult bindingResult = ex.getBindingResult();
        StringBuilder errMsg = new StringBuilder(bindingResult.getFieldErrors().size() * 16);
        for (int i = 0; i < bindingResult.getFieldErrors().size(); i++) {
            if (i > 0) {
                errMsg.append(",");
            }
            FieldError error = bindingResult.getFieldErrors().get(i);
            errMsg.append(error.getField() + ":" + error.getDefaultMessage());
        }
        return new Result(2999, errMsg.toString());
    }
}

测试

下列测试接口返回的数据类型为List 或 运行时出现异常 或 代码中手动抛出异常
其返回结果最终都是Result风格

@RestController
public class TestController {


    @GetMapping(value = "/v1/t1")
    public List<TestResp> t1() {
        List<TestResp> str = new ArrayList<>();

        TestResp testResp = new TestResp();
        testResp.setName("Jaye1");
        str.add(testResp);

        TestResp testResp1 = new TestResp();
        testResp1.setName("Jaye2");
        str.add(testResp1);

        TestResp testResp2 = new TestResp();
        testResp2.setName("Jaye3");
        str.add(testResp2);

        return str;
    }
    /*  返回结果
    {
        "data":
        [
            {"name": "Jaye1"},
            {"name": "Jaye2"},
            {"name": "Jaye3"}
        ],
        "msg": "ok",
        "code": 1,
        "timestamp": 1571810712022
    }
   */
	
	
    @GetMapping(value = "/v1/t2")
    public void t2() {
        int i = 1 / 0;
    }
    /*  返回结果
    {"data":null,"msg":"/ by zero","code":-1,"timestamp":1571810984834}*/


    @GetMapping(value = "/v1/t3")
    public void t3() {
        throw new AppException(RPC_FAIL, "rpc接口rpcDepot.getDepot()返回信息失败");
    }
    /*  返回结果
    {"data":null,"msg":"rpc接口rpcDepot.getDepot()返回信息失败","code":2,"timestamp":1571811083494}*/


    @GetMapping(value = "/v1/t4")
    public void t4() {
        throw new AppException(FAIL);
    }
    /*  返回结果
    {"data":null,"msg":"未处理异常","code":-1,"timestamp":1571811148791}*/
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 创建SpringBoot项目 首先,在IDE中创建一个SpringBoot项目,选择Maven作为构建工具,并在pom文件中添加SpringBoot和mybatis-plus的依赖。 2. 配置数据库连接 在application.properties文件中添加数据库连接信息,包括url、username、password等。 ``` spring.datasource.url=jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` 3. 创建实体类和mapper 创建实体类和对应的mapper接口,使用mybatis-plus的注解来简化SQL操作。例如: ```java @Data @TableName("user") // 表名 public class User { @TableId(value = "id", type = IdType.AUTO) // id字段自增 private Long id; @TableField("name") // name字段 private String name; @TableField("age") // age字段 private Integer age; } ``` ```java public interface UserMapper extends BaseMapper<User> { } ``` 4. 编写业务逻辑 根据具体需求编写业务逻辑代码,例如实现对用户的增删改查操作。使用mybatis-plus的CRUD方法来简化操作。 ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public boolean saveUser(User user) { return userMapper.insert(user) > 0; } @Override public boolean updateUser(User user) { return userMapper.updateById(user) > 0; } @Override public boolean deleteUser(Long id) { return userMapper.deleteById(id) > 0; } @Override public User getUserById(Long id) { return userMapper.selectById(id); } @Override public List<User> getUserList() { return userMapper.selectList(null); } } ``` 5. 编写Controller层 编写Controller层代码,处理HTTP请求并调用对应的业务逻辑方法。使用@RestController注解来标注该类是一个REST风格的控制器。 ```java @RestController public class UserController { @Autowired private UserService userService; @PostMapping("/user") public Result saveUser(@RequestBody User user) { boolean result = userService.saveUser(user); return result ? Result.success() : Result.error("保存用户失败"); } @PutMapping("/user") public Result updateUser(@RequestBody User user) { boolean result = userService.updateUser(user); return result ? Result.success() : Result.error("更新用户失败"); } @DeleteMapping("/user/{id}") public Result deleteUser(@PathVariable Long id) { boolean result = userService.deleteUser(id); return result ? Result.success() : Result.error("删除用户失败"); } @GetMapping("/user/{id}") public Result getUserById(@PathVariable Long id) { User user = userService.getUserById(id); return Result.success(user); } @GetMapping("/user") public Result getUserList() { List<User> userList = userService.getUserList(); return Result.success(userList); } } ``` 6. 测试接口 启动SpringBoot应用程序,使用Postman等工具测试接口,确认接口功能正常。 以上便是搭建SpringBoot mybatis-plus项目的基本流程。通过使用mybatis-plus来简化SQL操作,可以极大的提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值