此文主要是想在觀念上有所拓展。在日常的接口開發時,數據的輸出可以有兩種方式:
- 返回(常見)
- 拋出(可以理解爲越級的、越類型的返回)
我們經常會看到類似這樣的案例。爲了同時支持正常的數據和錯誤狀態,選擇一個通用的弱類型:
@Mapping("api/v1/demo")
@Controller
public class DemoController{
@Inject
UserService userService;
@Mapping("getUser")
public Result getUser(long userId){ //注意此處的返回類型
User user = userService.getUser(userId);
if(user == null){
return Result.failure(4001, "用戶不存在");
}else{
return Result.succeed(user);
}
}
}
Solon 還可以這麼幹。正常的數據用返回,不正常的狀態用拋出:
@Mapping("api/v1/demo")
@Controller
public class DemoController{
@Inject
UserService userService;
@Mapping("getUser")
public Result<User> getUser(long userId){
User user = userService.getUser(userId);
if(user == null){
//DataThrowable 可以把拋出的數據,進行自常渲染
throw new DataThrowable().data(Result.failure(4001, "用戶不存在"));
}else{
return Result.succeed(user);
}
}
}
如果再增加 “統一的渲染控制” 改造輸出結構,還可以是這樣的效果:
@Mapping("api/v1/demo")
@Controller
public class DemoController{
@Inject
UserService userService;
@Mapping("getUser")
public User getUser(long userId){
User user = userService.getUser(userId);
if(user == null){
throw ApiCodes.CODE_4001; //CODE_4001 是一個異常實例
}else{
return user;
}
}
}