處理創建請求
@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()));
}
.....
}