使用Spring MVC 开发 RESTful API(开发用户信息修改和删除服务)
常用的验证注解
自定义消息
自定义校验注解
常用的验证注解
自定义消息
在User.jsva里面在那些验证注解里面添加message来自定义消息
对应的controller的接口类:
@PutMapping("/user/{id:\\d+}")
publicUserupdate(@Valid@RequestBodyUseruser,BindingResulterrors){
if(errors.hasErrors()){
errors.getAllErrors().stream().forEach(error->{
// FieldError fieldError = (FieldError)error;
// String message = fieldError.getField()+" "+error.getDefaultMessage();
System.out.println(error.getDefaultMessage());
});
}
System.out.println(user.getId());
System.out.println(user.getUserName());
System.out.println(user.getUserPassword());
System.out.println(user.getBirthday());
user.setId("1");
returnuser;
}
然后再写测试类:
@Test
publicvoidwhenUpdateSuccess()throwsException{
Datedate=newDate(LocalDateTime.now().plusYears(1).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
System.out.println(date.getTime());
Stringcontent="{\"id\":\"1\",\"userName\":\"wang\",\"userPassword\":null,\"birthday\":"+date.getTime()+"}";
Stringresult=mockMvc.perform(MockMvcRequestBuilders.put("/user/1")
.contentType(MediaType.APPLICATION_JSON_UTF8).content(content))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$.id").value("1"))
.andReturn().getResponse().getContentAsString();
System.out.println(result);
}
得到结果:
从结果图中会发现显示出了自己的自定义错误消息,这样可以快速定位错误地方。
自定义校验注解
既然是自定义校验注解,那么是一定要自己写一个注解的,这样就轻松了到时候只要在相应的变量或者方法或者类上加一个注解就可以进行校验了
在包validator下面写一个
packagecom.imooc.validator;
importjavax.validation.Constraint;
importjavax.validation.Payload;
importjava.lang.annotation.ElementType;
importjava.lang.annotation.Retention;
importjava.lang.annotation.RetentionPolicy;
importjava.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MyConstraintValidator.class)
public@interfaceMyConstraint{
Stringmessage() ;
Class>[]groups()default{};
Class[]payload()default{};
}
以及它的实现类
packagecom.imooc.validator;
importcom.imooc.service.HelloServiceImp;
importorg.springframework.beans.factory.annotation.Autowired;
importjavax.validation.ConstraintValidator;
importjavax.validation.ConstraintValidatorContext;
publicclassMyConstraintValidatorimplementsConstraintValidator
@Autowired
privateHelloServiceImphelloServiceImp;
@Override
publicvoidinitialize(MyConstraintconstraintAnnotation) {
System.out.println("my validator init");
}
@Override
publicbooleanisValid(Objectvalue,ConstraintValidatorContextconstraintValidatorContext) {
helloServiceImp.greeting("wjc");
System.out.println(value);
returnfalse;
}
}
因为上面的isValid()方法是返回false的,所以必定会打印出我们自己的消息,所以测试用例:
@Test
publicvoidwhenUpdateSuccess()throwsException{
Datedate=newDate(LocalDateTime.now().plusYears(1).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
System.out.println(date.getTime());
Stringcontent="{\"id\":\"1\",\"userName\":\"wang\",\"userPassword\":null,\"birthday\":"+date.getTime()+"}";
Stringresult=mockMvc.perform(MockMvcRequestBuilders.put("/user/1")
.contentType(MediaType.APPLICATION_JSON_UTF8).content(content))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$.id").value("1"))
.andReturn().getResponse().getContentAsString();
System.out.println(result);
}
测试结果:
会发现打印出了--->这是一个测试的自定义消息
至此我们初步实现自己的校验注解
最后再写一下delete的请求的测试用例:
@Test
publicvoidwhenDeleteSuccess()throwsException{
mockMvc.perform(MockMvcRequestBuilders.delete("/user/1")
.contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(MockMvcResultMatchers.status().isOk());
}
以及controller里面的
@DeleteMapping("/user/{id:\\d+}")
publicvoiddelete(@PathVariableStringid){
System.out.println(id);
}
测试结果:
这个delete比较简单这里就一点带过了