Solon 用 throw 拋出數據的方式

此文主要是想在觀念上有所拓展。在日常的接口開發時,數據的輸出可以有兩種方式:

  • 返回(常見)
  • 拋出(可以理解爲越級的、越類型的返回)

我們經常會看到類似這樣的案例。爲了同時支持正常的數據和錯誤狀態,選擇一個通用的弱類型:

@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;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章