• 006 使用SpringMVC开发restful API四--用户信息的修复与删除,重在注解的定义


    一:任务

    1.任务

      常用的验证注解

      自定义返回消息

      自定义校验注解

    二:Hibernate Validator

    1.常见的校验注解

      

      

    2.程序

      测试类

     1 /**
     2      * @throws Exception 
     3      *  更新程序,主要是校验程序的验证
     4      * 
     5      */
     6     @Test
     7     public void whenUpdateSuccess() throws Exception {
     8         //JDK1.8的特性
     9         Date date=new Date(LocalDateTime.now().plusYears(1).
    10                 atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
    11         System.out.println(date.getTime());
    12         String content="{"id":"1","username":"tom","password":null,"birthday":"+date.getTime()+"}";
    13         String result=mockMvc.perform(MockMvcRequestBuilders.put("/user/1")
    14                 .contentType(MediaType.APPLICATION_JSON_UTF8)
    15                 .content(content))
    16             .andExpect(MockMvcResultMatchers.status().isOk())
    17             .andExpect(MockMvcResultMatchers.jsonPath("$.id").value("1"))
    18             .andReturn().getResponse().getContentAsString();
    19         System.out.println("result="+result);
    20     }

      User.java

     1 package com.cao.dto;
     2 
     3 import java.util.Date;
     4 
     5 import javax.validation.constraints.Past;
     6 
     7 import org.hibernate.validator.constraints.NotBlank;
     8 
     9 import com.fasterxml.jackson.annotation.JsonView;
    10 
    11 public class User {
    12     //接口
    13     public interface UserSimpleView {};
    14     public interface UserDetailView extends UserSimpleView {};    //继承之后,可以展示父的所有
    15     
    16     private String username;
    17     
    18     @NotBlank
    19     private String password;
    20     private String id;
    21     private Date birthday;
    22     
    23     @JsonView(UserSimpleView.class)
    24     public String getUsername() {
    25         return username;
    26     }
    27     public void setUsername(String username) {
    28         this.username = username;
    29     }
    30     
    31     @JsonView(UserDetailView.class)
    32     public String getPassword() {
    33         return password;
    34     }
    35     public void setPassword(String password) {
    36         this.password = password;
    37     }
    38     
    39     @JsonView(UserSimpleView.class)
    40     public String getId() {
    41         return id;
    42     }
    43     public void setId(String id) {
    44         this.id = id;
    45     }
    46     
    47     @Past
    48     @JsonView(UserSimpleView.class)
    49     public Date getBirthday() {
    50         return birthday;
    51     }
    52     public void setBirthday(Date birthday) {
    53         this.birthday = birthday;
    54     }
    55         
    56 }

      控制类

     1 @PutMapping("/{id:\d+}")
     2     public User update(@Valid @RequestBody User user,BindingResult errors){
     3         if(errors.hasErrors()) {
     4             errors.getAllErrors().stream().forEach(error->{
     5                 FieldError fieldError=(FieldError)error;
     6                 String message=fieldError.getField()+" : "+fieldError.getDefaultMessage();
     7                 System.out.println(message);
     8             }
     9         );
    10             
    11         }
    12         
    13         System.out.println(user.getId());
    14         System.out.println(user.getUsername());
    15         System.out.println(user.getPassword());
    16         System.out.println(user.getBirthday());
    17         
    18         user.setId("1");
    19         return user;
    20     }    

      效果:

      

    3.完善,自定义提示信息

      打印的提示信息是英文的,这里提示中文的

      在类上进行定义

     1 package com.cao.dto;
     2 
     3 import java.util.Date;
     4 
     5 import javax.validation.constraints.Past;
     6 
     7 import org.hibernate.validator.constraints.NotBlank;
     8 
     9 import com.fasterxml.jackson.annotation.JsonView;
    10 
    11 public class User {
    12     //接口
    13     public interface UserSimpleView {};
    14     public interface UserDetailView extends UserSimpleView {};    //继承之后,可以展示父的所有
    15     
    16     private String username;
    17     
    18     @NotBlank(message="密码不能为空")
    19     private String password;
    20     private String id;
    21     private Date birthday;
    22     
    23     @JsonView(UserSimpleView.class)
    24     public String getUsername() {
    25         return username;
    26     }
    27     public void setUsername(String username) {
    28         this.username = username;
    29     }
    30     
    31     @JsonView(UserDetailView.class)
    32     public String getPassword() {
    33         return password;
    34     }
    35     public void setPassword(String password) {
    36         this.password = password;
    37     }
    38     
    39     @JsonView(UserSimpleView.class)
    40     public String getId() {
    41         return id;
    42     }
    43     public void setId(String id) {
    44         this.id = id;
    45     }
    46     
    47     @Past(message="生日必须是过去的时间")
    48     @JsonView(UserSimpleView.class)
    49     public Date getBirthday() {
    50         return birthday;
    51     }
    52     public void setBirthday(Date birthday) {
    53         this.birthday = birthday;
    54     }
    55         
    56 }

      效果

      

    三:自定义校验注解

    1.新建一个Annotation

      

    2.程序

      校验类

     1 package com.cao.validator;
     2 
     3 import java.lang.annotation.ElementType;
     4 import java.lang.annotation.Retention;
     5 import java.lang.annotation.RetentionPolicy;
     6 import java.lang.annotation.Target;
     7 
     8 import javax.validation.Constraint;
     9 import javax.validation.Payload;
    10 
    11 @Target({ElementType.METHOD,ElementType.FIELD})
    12 @Retention(RetentionPolicy.RUNTIME)
    13 @Constraint(validatedBy = { MyContraintValidator.class })
    14 public @interface MyConstraint {
    15     //必写
    16     String message() default "{org.hibernate.validator.constraints.NotBlank.message}";
    17     Class<?>[] groups() default { };
    18     Class<? extends Payload>[] payload() default { };
    19     //
    20 }

      校验处理类

     1 import javax.validation.ConstraintValidatorContext;
     2 
     3 import org.springframework.beans.factory.annotation.Autowired;
     4 
     5 import com.cao.service.HelloService;
     6 import com.cao.service.impl.HelloServiceImpl;
     7 
     8 public class MyContraintValidator implements ConstraintValidator<MyConstraint,Object> {
     9 
    10     //这个校验中可以注入spring容器中的任何东西
    11     @Autowired
    12     public HelloService hello;
    13     
    14     @Override
    15     public void initialize(MyConstraint constraintAnnotation) {
    16         System.out.println("my constraint init");    
    17     }
    18 
    19     @Override
    20     public boolean isValid(Object value, ConstraintValidatorContext context) {
    21         hello.greeting("tomm");
    22         System.out.println(value);
    23         return false;
    24     }
    25 
    26 }

      注入使用的服务

    1 package com.cao.service;
    2 
    3 public interface HelloService {
    4     public String greeting(String name);
    5 }
     1 package com.cao.service.impl;
     2 
     3 import org.springframework.stereotype.Service;
     4 
     5 import com.cao.service.HelloService;
     6 
     7 //成为Spring容器中的服务了
     8 @Service
     9 public class HelloServiceImpl implements HelloService {
    10 
    11     @Override
    12     public String greeting(String name) {
    13         System.out.println("greeting hello");
    14         return "hello "+name;
    15     }
    16 
    17 }

      使用,放在User.java上

    @MyConstraint(message="这是一个测试")
    private String username;

      测试类

     1     /**
     2      * @throws Exception 
     3      *  更新程序,主要是校验程序的验证
     4      * 
     5      */
     6     @Test
     7     public void whenUpdateSuccess() throws Exception {
     8         //JDK1.8的特性
     9         Date date=new Date(LocalDateTime.now().plusYears(1).
    10                 atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
    11         System.out.println(date.getTime());
    12         String content="{"id":"1","username":"Bob","password":null,"birthday":"+date.getTime()+"}";
    13         String result=mockMvc.perform(MockMvcRequestBuilders.put("/user/1")
    14                 .contentType(MediaType.APPLICATION_JSON_UTF8)
    15                 .content(content))
    16             .andExpect(MockMvcResultMatchers.status().isOk())
    17             .andExpect(MockMvcResultMatchers.jsonPath("$.id").value("1"))
    18             .andReturn().getResponse().getContentAsString();
    19         System.out.println("result="+result);
    20     }

      效果

      

    四:用户删除

    1.程序

      测试类

     1 /**
     2      *  删除程序,主要是校验程序的验证
     3      * @throws Exception  
     4      */
     5     @Test
     6     public void whenDeleteSuccess() throws Exception {
     7         mockMvc.perform(MockMvcRequestBuilders.delete("/user/1")
     8                 .contentType(MediaType.APPLICATION_JSON_UTF8))
     9             .andExpect(MockMvcResultMatchers.status().isOk());
    10     }

      控制类

    1 @DeleteMapping("/{id:\d+}")
    2     public void delete(@PathVariable String id){
    3         System.out.println("id="+id);
    4     }    
  • 相关阅读:
    css 父层 透明 子层不透明Alpha
    ecshop循环foreach,iteration,key,index
    ecshop变量介绍
    ecshop 获取某个商品的 所有订单信息 或者销量
    echosp 销量排行 新增实际价格
    ecshop后台模板设置中将非可编辑区改为可编辑区
    ecshop 影响全局的标量lib_main.php
    个人js
    fixed的left:50%,漂浮
    js返回顶部
  • 原文地址:https://www.cnblogs.com/juncaoit/p/9710464.html
Copyright © 2020-2023  润新知