API 响应具有统一的格式,通常可以通过创建一个统一的响应对象来实现。这里,我们将定义一个 ResponseEntity
类来封装响应数据,并在控制器中使用它。
步骤 1: 定义统一响应格式
创建一个 ResponseEntity
类,用于封装所有 API 的响应数据。
ResponseEntity.java:
public class ResponseEntity<T> {
private boolean success;
private T data;
private String message;
private int status;
public ResponseEntity(T data, boolean success, String message, int status) {
this.data = data;
this.success = success;
this.message = message;
this.status = status;
}
// Getters
public boolean isSuccess() {
return success;
}
public T getData() {
return data;
}
public String getMessage() {
return message;
}
public int getStatus() {
return status;
}
}
步骤 2: 创建全局异常处理器
使用 @ControllerAdvice
注解创建一个全局异常处理器,捕获并处理所有未捕获的异常。
GlobalExceptionHandler.java:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentTypeMismatchException.class)
public ResponseEntity<Object> handleMethodArgumentTypeMismatch(MethodArgumentTypeMismatchException ex) {
return new ResponseEntity<>(null, false, "Type mismatch: " + ex.getMessage(), HttpStatus.BAD_REQUEST.value());
}
@ExceptionHandler(Exception.class)
public ResponseEntity<Object> handleException(Exception ex) {
return new ResponseEntity<>(null, false, "Internal server error: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR.value());
}
}
步骤 3: 控制器中使用
在控制器中,使用 ResponseEntity
来包装您的响应数据。
例如:
UserController.java:
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<User> selectById(@PathVariable Long id) {
User user = userService.getById(id);
if (user == null) {
return new ResponseEntity<>(null, false, "User not found", HttpStatus.NOT_FOUND.value());
}
return new ResponseEntity<>(user, true, "User found", HttpStatus.OK.value());
}
}
根据不同格式修改ResponseEntity<User>中的定义,例如多数据查询可改成ResponseEntity<List<User>>
步骤 4: 修改服务层
确保服务层的方法返回 User
对象。
UserService.java:
public interface UserService {
User getById(Long id);
}
UserServiceImpl.java:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User getById(Long id) {
return userMapper.selectById(id);
}
}
UserMapper.java:
public interface UserMapper extends BaseMapper<User> {
}
确保您的 UserMapper
接口继承自 BaseMapper<User>
,并且 MyBatis Plus 能够正确扫描到这个接口。
步骤 5: 测试 API:
在实施了这些更改之后,测试您的 API 以确保它返回格式化的响应。
通过这种方式,您可以在一个地方集中处理异常,并且确保所有的 API 响应都具有统一的格式。这不仅简化了控制器代码,还使得 API 的响应更加一致和可预测。