针对这个问题,我需要从以下几个方面来进行讲解:
- Spring Boot统一接口返回
- 全局异常处理
Spring Boot统一接口返回
在Spring Boot开发中,我们通常需要采用统一的接口返回格式,以便于前后端进行沟通和交互,同时对于异常情况也需要进行统一处理。
在实现统一接口返回的过程中,我们可以借助Spring Boot提供的ResponseBodyAdvice接口来完成。该接口可以用于对Controller层的返回值进行处理,并将其统一返回给前端。
具体实现方式如下:
- 创建一个返回类
public class Result<T> {
// 状态码
private Integer code;
// 状态码对应的提示信息
private String message;
// 返回的数据
private T data;
// 生成getter和setter方法
}
- 创建一个ResponseBodyAdvice类
@ControllerAdvice(basePackages = "com.xxx.controller")
public class ResultBodyAdvice implements ResponseBodyAdvice<Object> {
/**
* 是否支持advice功能
* @param methodParameter
* @param aClass
* @return
*/
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
/**
* 处理response的具体方法
* @param o
* @param methodParameter
* @param mediaType
* @param aClass
* @param serverHttpRequest
* @param serverHttpResponse
* @return
*/
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
if(o instanceof Result){
return o;
}
Result<Object> result = new Result<>();
result.setCode(HttpStatus.OK.value());
result.setMessage(HttpStatus.OK.getReasonPhrase());
result.setData(o);
return result;
}
}
- 在controller中返回结果
@RestController
public class UserController {
@GetMapping("/getuser")
public User getUser(){
User user = new User();
user.setName("张三");
user.setAge(20);
return user;
}
}
经过测试,可以看到返回结果已经被统一处理成了Result的格式:
{
"code":200,
"message":"OK",
"data":{
"name":"张三",
"age":20
}
}
全局异常处理
在Spring Boot开发中,如果不进行统一的异常处理,当出现异常情况时系统会直接返回异常信息,这样会使得接口的返回格式非常混乱,同时也不利于对异常情况的统一处理。
因此,我们需要对异常情况进行全局处理,可以采用Spring Boot提供的@ControllerAdvice注解配合@ExceptionHandler注解来完成,具体实现方式如下:
- 创建一个异常类
@AllArgsConstructor
@Getter
public class ErrorResponse {
// 状态码
private final Integer code;
// 错误信息
private final String message;
}
- 创建一个全局异常处理类
@ControllerAdvice(basePackages = "com.xxx.controller")
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ErrorResponse handleException(Exception e) {
if (e instanceof CustomException) {
CustomException customException = (CustomException) e;
return new ErrorResponse(customException.getCode(), customException.getMessage());
} else if (e instanceof MethodArgumentNotValidException) {
MethodArgumentNotValidException methodArgumentNotValidException = (MethodArgumentNotValidException) e;
BindingResult bindingResult = methodArgumentNotValidException.getBindingResult();
ObjectError objectError = bindingResult.getAllErrors().stream().findFirst().get();
return new ErrorResponse(HttpStatus.BAD_REQUEST.value(), objectError.getDefaultMessage());
} else if (e instanceof HttpMessageNotReadableException) {
return new ErrorResponse(HttpStatus.BAD_REQUEST.value(), "请求参数不正确");
}
return new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), "服务器内部错误");
}
}
- 在controller中制造异常
@RestController
public class UserController {
@GetMapping("/exception")
public void getException(){
throw new CustomException(HttpStatus.BAD_REQUEST.value(),"用户请求参数不正确");
}
}
经过测试,当访问Exception接口时会直接返回异常信息:
{
"code":400,
"message":"用户请求参数不正确"
}
当然,在我们的实际开发中,会遇到各种不同的异常情况,因此在全局异常处理的过程中,还需要根据实际情况进行针对性的异常处理。
上面的两个例子只是非常简单的示例,仅仅是展示了如何实现统一接口返回和全局异常处理。在我们的实际开发中一定要结合实际情况进行具体调整和优化。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot统一接口返回及全局异常处理 - Python技术站