spring引數傳遞和檢驗

沉澱發表於2017-07-10

1.背景

在spring請求時,要對引數進行檢查,以前一直使用如下方式來獲取引數,在引數特別多的時候,程式碼很不簡潔。

String userId= request.getParameter("userId");

後來使用註解@RequestParam程式碼整潔了好多

@RequestParam(value = "userId",required=true) String userId

後來對於引數比較多的情況,使用一個bean來接收請求引數

@RequestMapping(value="/saveUser")
public String saveUser(User user) {}

對於比較複雜,有層級關係情況,使用註解@RequestBody實現

public String setUser(@RequestBody String userInfo) {
    //使用fastjson轉換為實體類
}

不管使用以上的哪種方式都要對引數進行校驗,如果一個個引數的檢查是否為空,檢查邊界範圍,會導致程式碼很多。使用@Valid註解來對引數進行校驗能讓程式碼更整潔。

2.使用

本文以實體類接收請求引數為例簡單講解,validation一共有hibernate-validator,javax.validation和spring-validator三種註解,本文主要是簡單講解一下javax.validation的使用

@RequestMapping(value="/saveUser")
@ResponseBody
public JSONObject saveUser(@Valid User user, BindingResult result){
        JSONObject jsonObject = new JSONObject();
        //判斷是否檢驗錯誤資訊
        if(result.hasErrors()){
            //取出第一條錯誤資訊返回
            List<FieldError> list = result.getFieldErrors();
            String errorMessage = CollectionUtils.isEmpty(list)?
                    "引數錯誤!":list.get(0).getDefaultMessage();
            jsonObject.put("errorMessage",errorMessage );
            return jsonObject;
        }
        //saveUser儲存使用者資訊模組省略
        jsonObject.put("errorMessage","success");
        return jsonObject;
    }
//使用lombok
@Data
public class User implements Serializable{
    @NotNull(message = "使用者id不能為空")
    @Pattern(regexp="^\d{12}$",message = "使用者id非法")
    private String userId;
    private String userName;
    private int age;
}
  1. 使用@Valid註解進行引數檢查

  2. 在沒有使用BindingResult時,程式會丟擲空指標等異常資訊,不能返回自定義資訊,網上查了一下需要使用BindingResult來處理Error資訊,自定義返回錯誤資料。

  3. @NotNull,@Pattern,@Size,@Max,@Min,@Digits是我在專案中經常使用的註解

大家可以關注我的公眾號:不知風在何處,相互溝通,共同進步。

相關文章