1. 程式人生 > >Jfinal框架下Controller無法獲取post請求傳入的引數

Jfinal框架下Controller無法獲取post請求傳入的引數

最近幾天在整合專案,把一個系統要分離成兩個系統,分離過程中出現了問題。

未分離之前,當系統裡的所有訪問都是直接呼叫類方法即可;分離之後,要通過http請求去呼叫相關介面。使用get請求時,通過getPara()可以直接獲取引數,但是使用post沒有引數,除錯發現訪問控制器的時候param不存在。

網上有詹大神給網友的解釋,當在post請求引數中設定Content-Type為application/json或者text/json時,request.getParameter()並不能取到對應的引數,就會導致JFinal的Controller中getPara()方法也無法取到對應的引數。當你看getPara()方法的原始碼時就會發現,Jfinal獲取引數是直接呼叫了HttpServletRequest類的request.getParameter()相關方法。

getPara()獲取不到,詹大神還為我們提供了一種暴力獲取引數的方式,HttpKit.readData(getRequest());這個方法可以獲取任何種類請求的引數。這樣我們可以通過全域性攔截器或者所有控制器繼承基類,基類中覆蓋getPara方法,先去判斷請求type,若為json相關的請求,先用暴力獲取方式。我自己找了一種解決辦法:

寫一個BaseController類,讓所有控制器類繼承,基類裡新增以下方法。

public Record getArgsRecord() {

        String jsonStr = HttpKit.readData(getRequest());

        System.out.println("接收的JSON引數:" + jsonStr);

        if (StrKit.notBlank(jsonStr)) {

            @SuppressWarnings("unchecked")

            java.util.Map<String, Object> ls = FastJson.getJson().parse(jsonStr, java.util.Map.class);

            Record r = new Record().setColumns(ls);

            System.out.println("轉換為Record後的JSON引數:" + r.toJson());

            return r;

        } else {

            return new Record();

        }

    }

當某個介面是被post請求時,就在相應的接口裡新增以下程式碼:

        Record r = getArgsRecord();
        String name = r.getStr("name");
        int pId = r.getInt("pId");
        int sortNum = r.getInt("sortNum");

        int unitId = r.getInt("unitId"); 

這樣便可解決post請求無法獲取引數問題了。