定义统一返回体
@Data
@AllArgsConstructor
public class ApiResponse<T> {
private int status;
private String message;
private T data;
// 可选的静态方法,用于创建成功的ApiResponse对象
public static <T> ApiResponse<T> success(T data) {
return new ApiResponse<>(200, "Success", data);
}
// 可选的静态方法,用于创建失败的ApiResponse对象
public static <T> ApiResponse<T> error(String message) {
return new ApiResponse<>(500, message, null);
}
}
上述代码定义了一个通用的返回体ApiResponse
,包含状态码status
、消息message
和数据data
。通过success
方法创建成功的ApiResponse
对象,通过error
方法创建失败的ApiResponse
对象。
通过ControllerAdvice定义控制层响应参数包装处理
@RestControllerAdvice(basePackages = {"com.sweet.mix", "com.example.mix"})
public class ResultAdviceHandler implements ResponseBodyAdvice<Object> {
//supports方法用于实现是否符合处理条件,返回true时才会调用下面的beforeBodyWrite方法实现,否则不处理
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
/**
* 对于非ApiResult类型的返回值同一包装成ApiResult类型返回值后再写入response
*
* @param body:原controller接口要返回的内容
*/
@Override
public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType,
Class<? extends HttpMessageConverter<?>> aClass,
ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
if (body instanceof ApiResponse) {
//如果是ApiResponse类型则直接返回
return body;
} else if (body instanceof String) {
//这里需要注意 Controller 返回值为String类型时
//ControllerAdvice的beforeBodyWrite拦截到String结果
//在函数中处理String完成返回的结果不会有转换成json这一步操作
//所以不判断的话会直接返回String类型
//这时候如果我们ApiResponse.success(body)组装了结果,那么显然不是String
//所以会报错cast not to string
//所以这里需要一个String类型的判断 主动把结果转为json格式的字符串
return JSON.toJSONString(ApiResponse.success(body));
}
return ApiResponse.success(body);
}
}
上述代码定义了一个ResultAdviceHandler
类,使用@RestControllerAdvice
注解将其配置为全局的控制器增强,指定扫描的控制层所在的包。ResultAdviceHandler
实现了ResponseBodyAdvice
接口,通过重写supports
方法和beforeBodyWrite
方法实现对响应参数的包装处理。
supports
方法用于判断是否需要对响应参数进行处理,这里返回true
表示对所有参数进行处理。
beforeBodyWrite
方法用于对非ApiResponse
类型的返回值进行包装,将其转换为ApiResponse
类型后再写入response。同时,对于返回值为String
类型的情况,需要将其转换为ApiResponse
对象的json格式字符串。
控制层代码
@RestController
@RequestMapping("/test")
public class DepartmentController {
@ExecutionTime
@GetMapping("/test")
public String test(){
return "OK";
}
@GetMapping("/test2")
public Integer test2(){
return 2;
}
}
上述代码是一个示例的控制层代码,其中test
方法返回字符串"OK"
,test2
方法返回整数2
。
控制层无需任何处理,即可实现响应客户端时统一返回ApiResponse
的结构。
示例
请求:http://localhost:9000/test/test
响应:
{
"status": 200,
"message": "Success",
"data": "OK"
}
以上是一个使用ApiResponse
统一包装响应体的示例,通过ResultAdviceHandler
实现了对控制层返回值的统一处理。这样可以更好地控制响应结果的结构和格式,并且可以方便地添加其他自定义的返回信息。