【Spring Security OAuth2筆記系列】- 【使用Spring MVC開發RESTful API】 用戶信息修改和刪除

用戶信息修改和刪除

本節類容

  • 常用的驗證註解
  • 自定義消息
  • 自定義校驗註解

常用的驗證註解

自己官網或則百度吧。

官網文檔
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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章