Solon 用 throw 丟擲資料

帶刺的坐椅發表於2023-05-17

此文主要是想在觀念上有所擴充。在日常的介面開發時,資料的輸出可以有兩種方式:

  • 返回(常見)
  • 丟擲(可以理解為越級的、越型別的返回)

我們經常會看到類似這樣的案例。為了同時支援正常的資料和錯誤狀態,選擇一個通用的弱型別:

@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;
        }
    }
}

相關文章