【Spring Security OAuth2】- 【使用Spring MVC开发RESTful API】 用户信息修改和删除

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

用户信息修改和删除

本节类容

  • 常用的验证注解
  • 自定义消息
  • 自定义校验注解

常用的验证注解

自己官网或则百度吧。

官网文档
Documentation - Hibernate Validator
Hibernate Validator 8.0.1.Final - Jakarta Bean Validation Reference Implementation: Reference Guide

编写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 2023/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 2023/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);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值