Spring MVC注解@Valid、@JsonSerialize、@JsonView等

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/yuchao2015/article/details/78695954


@Valid

Spring MVC采用的校验是hibernate-validate,第一步肯定是导包,就忽略了

可使用的校验注解


  
  
  1. @NotNull 值不能为空
  2. @Null 值必须为空
  3. @Pattern(regex=) 字符串必须匹配正则表达式
  4. @Size(min=,max=) 集合的元素数量必须在min和max之间
  5. @CreditNumber(ignoreNonDigitCharacters=) 字符串必须是信用卡号(按美国的标准验证)
  6. @Email 字符串必须是Email地址
  7. @Length(min=,max=) 检查字符串的长度
  8. @NotBlank 字符串必须有字符
  9. @Range(min=,max=) 数字必须大于min,小于等于max
  10. @SafeHtml 字符串是安全的html
  11. @URL 字符串是合法的URL
  12. @AssertFalse 值必须是 false
  13. @AssertTrue 值必须是 true
  14. @DecimalMax(value,inclusive=) 值必须小于等于(inclusive= true)/小于(inclusive= false) value属性指定的值,可以注解在字符串类型的属性上
  15. @DecimalMin(value,inclusive=) 值必须大于等于(inclusive= true)/大于(inclusive= false) value属性指定的值,可以注解在字符串类型的
  16. 属性上
  17. @Digits(integer=,fraction=) 数字格式检查,integer指定整数部分的最大长度,fraction指定小数部分的最大长度
  18. @Future 值必须是未来的日志
  19. @Past 值必须是过去的日期
  20. @Max(value=) 值必须小于等于value指定的值,不能注视在字符串类型的属性上
  21. @Min(value=) 值必须大于等于value指定的值,不能注视在字符串类型的属性上

简单的校验

用法,首先定义实体

 
 

  
  
  1. public class User {
  2. private String id;
  3. private String username;
  4. @NotBlank(message = "密码不能为空")
  5. private String password;
  6. @Past(message = "生日必须是过去的时间")
  7. private Date birthday;
  8. //getter and setter
  9. }

控制层实现:
 
 

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

ok,错误信息就会打印出来,就可以做自己的逻辑处理了
 
 

自定义校验器校验

 
 

  
  
  1. /**
  2. * 自定义的校验器
  3. * Created by xingyuchao on 2017/12/2.
  4. */
  5. @Target({ElementType.METHOD, ElementType.FIELD})
  6. @Retention(RetentionPolicy.RUNTIME)
  7. @Constraint(validatedBy = MyConstraintValidator.class)
  8. public @interface MyConstraint {
  9. String message();
  10. Class<?>[] groups() default { };
  11. Class<? extends Payload>[] payload() default { };
  12. String field() default "";
  13. }
上面那三个属性是必须的
 
 
完成校验逻辑,需要注意的是实现了ConstraintValidator的类已经在spring容器中了,因此可以使用注入其它类了
 
 

  
  
  1. public class MyConstraintValidator implements ConstraintValidator<MyConstraint, Object> {
  2. @Autowired
  3. private HelloService helloService;
  4. @Override
  5. public void initialize(MyConstraint constraintAnnotation) {
  6. System.out.println( "my validator init");
  7. }
  8. @Override
  9. public boolean isValid(Object value, ConstraintValidatorContext context) {
  10. helloService.greeting( "tom");
  11. System.out.println(value);
  12. return false; //返回true则校验通过,false校验不通过
  13. }
  14. }

使用

  
  
  1. private String id;
  2. @MyConstraint(message = "这是一个校验测试")
  3. private String username;
  4. @NotBlank(message = "密码不能为空")
  5. private String password;
  6. @Past(message = "生日必须是过去的时间")
  7. private Date birthday;

@JsonView

@JsonView可以过滤序列化对象的字段属性,可以使你有选择的序列化对象。


使用步骤:

  1. 使用接口来声明多个视图
  2. 在值对象的get方法上指定视图
  3. 在controller方法上指定视图


   
   
  1. public class User {
  2. public interface UserSimpleView {};
  3. public interface UserDetailView extends UserSimpleView {};
  4. private String username;
  5. private String password;
  6. @JsonView(UserSimpleView.class)
  7. public String getUsername() { return username; }
  8. public void setUsername(String username) { this.username = username;}
  9. @JsonView(UserDetailView.class)
  10. public String getPassword() { return password;}
  11. public void setPassword(String password) { this.password = password;}
  12. }


 
 

  
  
  1. @RestController
  2. @RequestMapping( "/user")
  3. public class UserController {
  4. @GetMapping
  5. @JsonView(User.UserSimpleView.class)
  6. public List<User> query(UserQueryCondition condition,
  7. @PageableDefault(page = 2, size = 17, sort = "username",direction= Sort.Direction.DESC) Pageable pageable){
  8. System.out.println(ReflectionToStringBuilder.toString(condition, ToStringStyle.MULTI_LINE_STYLE)); //打印toString
  9. System.out.println(pageable.getPageSize());
  10. System.out.println(pageable.getPageNumber());
  11. System.out.println(pageable.getSort());
  12. List<User> userList = new ArrayList<>();
  13. userList.add( new User());
  14. userList.add( new User());
  15. userList.add( new User());
  16. return userList;
  17. }
  18. //{id:\\d+} 表示只能是数字
  19. @GetMapping( "/{id:\\d+}")
  20. @JsonView(User.UserDetailView.class)
  21. public User getInfo( @PathVariable String id) {
  22. // throw new RuntimeException("user not exist");
  23. System.out.println( "进入getInfo服务");
  24. User user = new User();
  25. user.setUsername( "tom");
  26. return user;
  27. }
  28. }


@JsonSerialize

 
 
此注解用于属性或者getter方法上,用于在序列化时嵌入我们自定义的代码,比如序列化一个double时在其后面限制两位小数点。

因为在java中日期时期的时间戳是ms,我现在需要将ms转换为s,也就是除以1k
 
 
 
 

  
  
  1. public class Date2LongSerializer extends JsonSerializer<Date> {
  2. @Override
  3. public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
  4. jsonGenerator.writeNumber(date.getTime() / 1000);
  5. }
  6. }


使用:
 
 

  
  
  1. private String id;
  2. @MyConstraint(message = "这是一个校验测试")
  3. private String username;
  4. @NotBlank(message = "密码不能为空")
  5. private String password;
  6. @JsonSerialize(using = Date2LongSerializer.class)
  7. @Past(message = "生日必须是过去的时间")
  8. private Date birthday;

这样就完成了时间戳13位到10位的转换
 
 

@JsonIgnore、@JsonIgnoreProperties

@JsonIgnoreProperties:此注解是类注解,作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。@JsonIgnore:此注解用于属性或者方法上(最好是属性上),作用和上面的@JsonIgnoreProperties一样。
都是用于Json转换忽略空字段,也可以通过其它方式控制
第一种局部控制:
 
 
 
 
 
 
第二种:全局控制,我这用的springboot
 
 
 
 
 
 
还有其它json的相关注解,就不列举了,可以参考:https://www.cnblogs.com/guijl/p/3855329.html



        </div>
            </div>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值