Solon 統一的返回結果調整

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

使用 “統一的渲染控制” 可以對輸出做統一的控制外。。。還可以藉助路由攔截器 RouterInterceptor ,對 mvc 返回結果做提交確認機制(即可修改)進行控制(相對來講,這個可能更簡單)。。。關於全域性的請求異常處理,最好不要放在這裡。。。放到過濾器(因為它是最外層的,還可以捕捉 mvc 之外的異常)

這個文,也相當是對 RouterInterceptor 應用的場景演示(只是示例,具體根據自己的情況處理):

1、案例1:為返回結果統一加上外套

@Component
public class GlobalResultInterceptor implements RouterInterceptor {
   
    @Override
    public void doIntercept(Context ctx, Handler mainHandler, RouterInterceptorChain chain) throws Throwable {
        //提示:這裡和 doFilter 差不多...
        chain.doIntercept(ctx, mainHandler);
    }

     /**
     * 提交結果( render 執行前呼叫)//不要做太複雜的事情
     */
    @Override
    public Object postResult(Context ctx, Object result) throws Throwable {
        if(result instanceof Throwable){
            //異常型別,根據需要處理
            return result;
        }else{
            //例:{"name":"noear"} 變成 {"code":200,"description":"","data":{"name":"noear"}}
            return Result.succeed(result);
        }
    }
}

2、案例2:使用翻譯框架對 mvc 返回結果做處理

@Component
public class GlobalTransInterceptor implements RouterInterceptor {
    @Inject
    private TransService transService;

    
    @Override
    public void doIntercept(Context ctx, Handler mainHandler, RouterInterceptorChain chain) throws Throwable {
        //提示:這裡和 doFilter 差不多...
        chain.doIntercept(ctx, mainHandler);
    }

     /**
     * 提交結果( render 執行前呼叫)//不要做太複雜的事情
     */
    @Override
    public Object postResult(Context ctx, Object result) throws Throwable {
        //提示:此處只適合做結果型別轉換
        if (result != null && !(result instanceof Throwable) && ctx.action() != null) {
            result = transService.transOneLoop(result, true);
        }

        return result;
    }
}

相關文章