1. 程式人生 > >RESTful 使用者建立請求、SpringMvc的Valid註解(三)

RESTful 使用者建立請求、SpringMvc的Valid註解(三)

處理建立請求
@RequestBody 對映請求體到java 方法的引數
@Valid註解和BindingResult驗證請求引數的合法性並處理校驗結果

1.使用者建立請求

測試用例

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework
.test.web.servlet.result.MockMvcResultMatchers.status; @Test public void whenCreateSuccess(){ String content = "{\"username\":\"tom",\"password":\"123\" }" ; mockMvc.perform(post("/user") .contentType(MediaType.APPLICATION_JSON_UTF8) .content(content)) .andExcept(jsonPath("$.id").value
("1")); }

Controller

RequestBody註解 將json字串自動填充物件

@RequestMapping(value="/user",method =RequestMethod.POST)
public User create(@RequestBody User user ){
    user.setId("1");
    return user ; 
}

2.Valid註解的使用

校驗在寫API的時候是一個不可避免的事情,需要驗證使用者傳遞過來的資料是不是有效果的
只有在使用者傳遞過來的資料滿足你的業務要求的時候才應該的去進行業務的處理。校驗是一個十分常見的場景 那麼如果去校驗呢?
最簡單的方式就是直接寫程式碼
比如說用前臺傳遞過來使用者的密碼 後臺可以用

if(StringUtils.isBlank(user.getPassword()){
    throw new RuntimeException("密碼為空");
}

去做校驗

在實體類 欄位加 @NotBlank註解

/**
 *  使用者實體類
 * @author ZhuPengWei
 */
public class User {
    public interface UserSimpleView {}
    public interface UserDetailView extends UserSimpleView {}
    private Long id;
    @NotBlank(message = "使用者名稱不能為空")
    private String username;
    @NotBlank(message = "密碼不能為空")
    private String password;
    private Date birthday;
}

那麼什麼時候會用到BindingResult這個註解呢? 如果上如物件傳遞的password 為空的時候
後臺的服務直接就打回去了,根本就不會進我們的方法裡面。在有些時候,我們可以需要做一些處理
比如說校驗沒過,密碼沒填 需要做一個日誌 。如果既能收集到錯誤的資訊,又不直接把請求打過去
帶著這個錯誤資訊進入到這個方法體裡面? 這BindingResult 的作用了。

@PostMapping"/user")
public User create(@Validate @RequestBody User user , BindingResult erros){
    if(erros.hasErrors()){
         errors.getAllErrors().stream().forEach(error ->sout (error.getDefalutMessage()));
      }
      .....
}