JFinal請求參數注解判空

在進行后端開發的過程當中,都會需要使用到字段非空判斷,請求的字段如果為空的話,則不走Controller。
本文記錄一下在JFinal當中配置自定義注解非空判斷。

首先 新建一個注解類

import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface EmptyInterface {
    String[] value();
}

創建自定義的Handler 繼承自JFinal的Handler

/**
 * Created by Pencilso on 2017/5/4.
 */
public class HandlerInter extends Handler {
    @Override
    public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
        String urlPara[] = {null};
        Action action = JFinal.me().getAction(target, urlPara);
        EmptyInterface annotation = action.getMethod().getAnnotation(EmptyInterface.class);
        if (annotation != null) {
            noEmpty(annotation, target, request, response, isHandled);
        } else next.handle(target, request, response, isHandled);
    }

    public void noEmpty(EmptyInterface annotation, String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
        String header = request.getHeader("Content-Type"); //取出head頭
        if (header != null && header.indexOf("multipart/form-data") != -1) { //判斷是否是form-data 否則有可能會報錯  之前線上出現過一次log信息
            request = new MultipartRequest(request);
            ((MultipartRequest) request).getFiles();
        }
        String[] value = annotation.value();
        for (String v : value) {
            String parameter = request.getParameter(v);
            if (parameter == null || parameter.trim().length() == 0) {
                Utils.outEmpty(response, request, v);
                isHandled[0] = true;
                break;
            }
        }
        if (!isHandled[0])
            next.handle(target, request, response, isHandled);
    }
}

新建一個Utils類

 /**
 *
 * @param response 響應
 * @param request   請求
 * @param param 為空的字段
 */
public static void outEmpty(HttpServletResponse response, HttpServletRequest request, String param) {
    try {
        response.setHeader("Content-Type", "application/json;charset=UTF-8"); //設置返回頭是json格式
        PrintWriter writer = response.getWriter();
        request.getInputStream().close();
        writer.println(ErrorInfo.Json(CodeUtils.ONERROR, param + " can 'not null").toString());  //輸出錯誤信息,我這里將其封裝了起來 封裝了一個JSON的數據
        writer.flush();
        writer.close();
    } catch (Exception e) {
    }
}

打開JFinal的Config類,在configHandler(Handlers me) 方法下 將自定義的Handler攔截器加入。

使用方法

單參使用可以直接 @EmptyInterface("field") 多參需要大括號擴起來。

為空測試

正常測試

起初本想通過攔截全局Controller來進行字段非空驗證,后來發現 一個Clear就將其給清除掉了。雖然Clear可以指定清除某一個攔截器,但不是很方便。
雖然官方也有Validator 配置,不過感覺不好使。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,287評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 兒子想吃丸子,我連續兩天都鼓搗著炸了素丸子。看著兒子吃著美滋滋的樣子,心理也算歡喜。 老公昨晨6:30就走了,出差...
    晨晚兒閱讀 183評論 0 1
  • 大家還記得影響了好幾代人的和創造了中國最牛的樂隊的黃家駒嗎?我很喜歡聽他的歌,我覺得那不是歌,而是一個一個的視頻在...
    神1樣的男子閱讀 856評論 0 0
  • 我喜歡周六未及七點時刻的早上,空氣彌漫煙燒火柴的味道,我喜歡此刻推門而出的感覺,眾人沉睡唯我獨醒著,瞬間成為世界的...
    世間塵的塵閱讀 306評論 13 17