用戶信息修改和刪除
本節類容
- 常用的驗證註解
- 自定義消息
- 自定義校驗註解
常用的驗證註解
自己官網或則百度吧。
官網文檔
http://hibernate.org/validator/documentation/
https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/
編寫update測試用例
@Test
public void whenUpdateSuccess() throws Exception {
// jdk8的時間處理類;使用LocalDateTime必須傳遞時區
// 給定一個一年後的時間
// long birthday = LocalDateTime.now().plusYears(1).atZone(ZoneId.systemDefault()).toEpochSecond();
// 注意這裏的api不要傳錯了。是毫秒不是秒
long birthday = LocalDateTime.now().plusYears(1).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
String content = "{\"username\":\"mrcode\",\"password\":null,\"birthday\":" + birthday + "}";
String contentAsString = mockMvc.perform(put("/user/1")
.contentType(APPLICATION_JSON_UTF8)
.content(content)
)
.andExpect(status().isOk())
.andExpect(jsonPath("$.id").value("1"))
.andReturn().getResponse().getContentAsString();
System.out.println(contentAsString);
}
編寫update api
@PutMapping("/{id:\\d+}")
public User update(@PathVariable() String id, @Valid @RequestBody User user, BindingResult errors) {
if (errors.hasErrors()) {
errors.getAllErrors().stream().forEach(err -> {
FieldError fieldError = (FieldError) err;
System.out.println(fieldError.getField() + " : " + err.getDefaultMessage());
});
}
System.out.println(ReflectionToStringBuilder.toString(user, ToStringStyle.MULTI_LINE_STYLE));
user.setId(id);
return user;
}
同樣需要對user對象的生日添加過去時註解
@Past // 必須是過去時間
@JsonView(UserSimpleView.class)
private Date birthday;
運行測試用例輸出
password : must not be blank
birthday : must be a past date
com.example.demo.dto.User@1980a3f[
id=<null>
username=mrcode
password=<null>
birthday=Fri Aug 02 11:41:59 GMT+08:00 2019
]
{"id":"1","username":"mrcode","password":null,"birthday":"2019-08-02 11:41:59"}
這裏的錯誤信息是英文,下面自定義錯誤信息
自定義驗證信息
@NotBlank(message = "密碼不能爲空")
private String password;
@Past(message = "生日必須是過去時間") // 必須是過去時間
@JsonView(UserSimpleView.class)
private Date birthday;
------ 就能讓錯誤信息變成自定義的了 -----
password : 密碼不能爲空
birthday : 生日必須是過去時間
自定義校驗註解
自定義註解
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
/**
* <pre>
* 自定義註解8
* </pre>
* @author zhuqiang
* @version 1.0.0
* @date 2018/8/2 12:33
* @since 1.0.0
*/
@Target({METHOD, FIELD})
@Retention(RetentionPolicy.RUNTIME) // 註釋信息保留在運行時
@Constraint(validatedBy = MyConstraintValidator.class) // 用於什麼類來校驗這個註解,也就是有該註解的時候執行什麼邏輯
public @interface MyConstraint {
// 下面三個屬性是必須的,要使用hibernate.validator這個引擎來使用的話
// 具體的可以去深入
// 這裏可以隨意仿照一個 之前用到的註解中的源碼,就能看到都有下面三個屬性
String message();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
自定義註解邏輯
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* 自定義註解
* @author zhuqiang
* @version 1.0.1 2018/8/2 12:32
* @date 2018/8/2 12:32
* @since 1.0
*/
// 綁定一個註解類型,用於驗證的值是什麼
// 如果Object換成String,那麼則只能把註解放在String類型上
public class MyConstraintValidator implements ConstraintValidator<MyConstraint, Object> {
// 實現ConstraintValidator接口後,會被spring掃描管理,所以可以直接使用注入服務
// 在idea 2017.3.2 版本中,可以看到該行代碼前面有被管理到的一個標誌圖標
// @Autowired
// private UserController userController;
@Override
public void initialize(MyConstraint constraintAnnotation) {
System.out.println("初始化信息");
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
// 校驗邏輯
System.out.println(value + " : " + context);
return false; // 返回false 表示驗證不通過
}
}
使用自定義註解
@MyConstraint(message = "自定義註解演示使用")
private String username;
只要一個有驗證信息的方法,運行測試用例查看信息
初始化信息
mrcode : org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorContextImpl@664e848c
password : 密碼不能爲空
username : 自定義註解演示使用
birthday : 生日必須是過去時間
這裏可以看到注入的上下文(ConstraintValidatorContext)是hibernate的一個類,也證明了我們使用的javax 的註解,但是還是hibernate框架實現的校驗邏輯
刪除服務
沒有特別的要講解的
@Test
public void whenDeleteSuccess() throws Exception {
mockMvc.perform(delete("/user/1")
.contentType(APPLICATION_JSON_UTF8)
)
.andExpect(status().isOk());
}
@DeleteMapping("/{id:\\d+}")
public void delete(@PathVariable String id) {
System.out.println("id:" + id);
}