当前位置:   article > 正文

java中参数校验_java 参数校验的几种方式

java 参数校验的几种方式

1.常见的验证的方式

前端的校验是必须的,这个很简单,因为客户体验。后台的校验更是必须的,关键在于如何与目前我们的分层思想(控制层、业务层、持久层)综合起来考虑。在每层都要进行校验吗?还是只在是某个特定层做就可以了?是否有好的校验框架(如前端的jquery校验框架、springmvc校验框架)?总之校验框架还是有很多的,原理不就是对后端接收的数据进行特定规则的判断,那我们怎么制定规则,有怎么去检验呢?

1、表现层验证:SpringMVC提供对JSR-303的表现层验证; 
2、业务逻辑层验证:Spring3.1提供对业务逻辑层的方法验证(当然方法验证可以出现在其他层,但笔者觉得方法验证应该验证业务逻辑); 
3、DAO层验证:Hibernate提供DAO层的模型数据的验证(可参考hibernate validator参考文档的7.3. ORM集成)。 
4、数据库端的验证:通过数据库约束来进行; 
5、客户端验证支持:JSR-303也提供编程式验证支持。

2. Hibernate Validator 的作用

  • 验证逻辑与业务逻辑之间进行了分离,降低了程序耦合度;
  • 统一且规范的验证方式,无需你再次编写重复的验证代码;
  • 你将更专注于你的业务,将这些繁琐的事情统统丢在一边。

Hibernate Validator 的使用

  1. <dependency>
  2. <groupId>org.hibernate</groupId>
  3. <artifactId>hibernate-validator</artifactId>
  4. <version>6.0.9.Final</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>javax.el</groupId>
  8. <artifactId>javax.el-api</artifactId>
  9. <version>3.0.0</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.glassfish</groupId>
  13. <artifactId>javax.el</artifactId>
  14. <version>3.0.1-b08</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.projectlombok</groupId>
  18. <artifactId>lombok</artifactId>
  19. <version>${lombok.version}</version>
  20. </dependency>

测试类

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class MyAccount {
  5. private String id;
  6. @NotNull
  7. @Length(max = 20)
  8. private String userName;
  9. @NotNull
  10. @Pattern(regexp = "[A-Z][a-z][0-9]")
  11. private String passWord;
  12. @DateTimeFormat(pattern = "yyy-MM-dd")
  13. private Date createTime;
  14. private String alias;
  15. @Max(10)
  16. @Min(1)
  17. private Integer level;
  18. private Integer vip;
  19. }

api访问

  1. @PostMapping("/mytest")
  2. @ResponseBody
  3. public Object myTest(@RequestBody @Valid MyAccount account) {
  4. return account;
  5. }

封装工具

  1. public class ValidationUtil {
  2. /**
  3. * 开启快速结束模式 failFast (true)
  4. */
  5. private static Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(false).buildValidatorFactory().getValidator();
  6. /**
  7. * 校验对象
  8. *
  9. * @param t bean
  10. * @param groups 校验组
  11. * @return ValidResult
  12. */
  13. public static <T> ValidResult validateBean(T t, Class<?>... groups) {
  14. ValidResult result = new ValidationUtil().new ValidResult();
  15. Set<ConstraintViolation<T>> violationSet = validator.validate(t, groups);
  16. boolean hasError = violationSet != null && violationSet.size() > 0;
  17. result.setHasErrors(hasError);
  18. if (hasError) {
  19. for (ConstraintViolation<T> violation : violationSet) {
  20. result.addError(violation.getPropertyPath().toString(), violation.getMessage());
  21. }
  22. }
  23. return result;
  24. }
  25. /**
  26. * 校验bean的某一个属性
  27. *
  28. * @param obj bean
  29. * @param propertyName 属性名称
  30. * @return ValidResult
  31. */
  32. public static <T> ValidResult validateProperty(T obj, String propertyName) {
  33. ValidResult result = new ValidationUtil().new ValidResult();
  34. Set<ConstraintViolation<T>> violationSet = validator.validateProperty(obj, propertyName);
  35. boolean hasError = violationSet != null && violationSet.size() > 0;
  36. result.setHasErrors(hasError);
  37. if (hasError) {
  38. for (ConstraintViolation<T> violation : violationSet) {
  39. result.addError(propertyName, violation.getMessage());
  40. }
  41. }
  42. return result;
  43. }
  44. /**
  45. * 校验结果类
  46. */
  47. @Data
  48. public class ValidResult {
  49. /**
  50. * 是否有错误
  51. */
  52. private boolean hasErrors;
  53. /**
  54. * 错误信息
  55. */
  56. private List<ErrorMessage> errors;
  57. public ValidResult() {
  58. this.errors = new ArrayList<>();
  59. }
  60. public boolean hasErrors() {
  61. return hasErrors;
  62. }
  63. public void setHasErrors(boolean hasErrors) {
  64. this.hasErrors = hasErrors;
  65. }
  66. /**
  67. * 获取所有验证信息
  68. *
  69. * @return 集合形式
  70. */
  71. public List<ErrorMessage> getAllErrors() {
  72. return errors;
  73. }
  74. /**
  75. * 获取所有验证信息
  76. *
  77. * @return 字符串形式
  78. */
  79. public String getErrors() {
  80. StringBuilder sb = new StringBuilder();
  81. for (ErrorMessage error : errors) {
  82. sb.append(error.getPropertyPath()).append(":").append(error.getMessage()).append(" ");
  83. }
  84. return sb.toString();
  85. }
  86. public void addError(String propertyName, String message) {
  87. this.errors.add(new ErrorMessage(propertyName, message));
  88. }
  89. /**
  90. * 获取去重之后的非法属性值,以逗号分隔
  91. * @return
  92. */
  93. public String getProperties() {
  94. return errors.stream().map(error -> error.getPropertyPath()).collect(Collectors.toSet()).stream().collect(Collectors.joining(", "));
  95. }
  96. }
  97. @Data
  98. public class ErrorMessage {
  99. private String propertyPath;
  100. private String message;
  101. public ErrorMessage() {
  102. }
  103. public ErrorMessage(String propertyPath, String message) {
  104. this.propertyPath = propertyPath;
  105. this.message = message;
  106. }
  107. }
  108. }

自定义校验器

  1. @Target({FIELD})
  2. @Retention(RUNTIME)
  3. @Documented
  4. @Constraint(validatedBy = {DateValidator.DateValidatorInner.class})
  5. public @interface DateValidator {
  6. /**
  7. * 必须的属性
  8. * 显示 校验信息
  9. * 利用 {} 获取 属性值,参考了官方的message编写方式
  10. *
  11. * @see org.hibernate.validator 静态资源包里面 message 编写方式
  12. */
  13. String message() default "日期格式不匹配{dateFormat}";
  14. /**
  15. * 必须的属性
  16. * 用于分组校验
  17. */
  18. Class<?>[] groups() default {};
  19. Class<? extends Payload>[] payload() default {};
  20. /**
  21. * 非必须
  22. */
  23. String dateFormat() default "yyyy-MM-dd HH:mm:ss";
  24. /**
  25. * 必须实现 ConstraintValidator接口
  26. */
  27. class DateValidatorInner implements ConstraintValidator<DateValidator, String> {
  28. private String dateFormat;
  29. @Override
  30. public void initialize(DateValidator constraintAnnotation) {
  31. this.dateFormat = constraintAnnotation.dateFormat();
  32. }
  33. /**
  34. * 校验逻辑的实现
  35. *
  36. * @param value 需要校验的 值
  37. * @return 布尔值结果
  38. */
  39. @Override
  40. public boolean isValid(String value, ConstraintValidatorContext context) {
  41. if (value == null) {
  42. return true;
  43. }
  44. if ("".equals(value)) {
  45. return true;
  46. }
  47. try {
  48. Date date = DateUtils.parseDate(value, dateFormat);
  49. return date != null;
  50. } catch (ParseException e) {
  51. return false;
  52. }
  53. }
  54. }
  55. }

定义分组

  1. public interface AccountGroup {
  2. }

使用自定义校验器和自定义分组:

 

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class MyAccount {
  5. private String id;
  6. @NotNull
  7. @Length(max = 20)
  8. private String userName;
  9. @NotNull
  10. @Pattern(regexp = "[A-Z][a-z][0-9]")
  11. private String passWord;
  12. @DateTimeFormat(pattern = "yyy-MM-dd")
  13. private Date createTime;
  14. // @Pattern(regexp = "[A-Z][a-z][0-9]")
  15. @Min(2)
  16. private String alias;
  17. @Max(10)
  18. @Min(1)
  19. private Integer level;
  20. private Integer vip;
  21. @DateValidator(dateFormat = "yyyy-MM-dd", groups = {AccountGroup.class})
  22. private String birthday;
  23. }

其他常用constranint

  1. @AssertFalse @AssertTrue 检验boolean类型的值
  2. @DecimalMax @DecimalMin 限定被标注的属性的值的大小
  3. @Digits(intege=,fraction=) 限定被标注的属性的整数位数和小数位数
  4. @Future检验给定的日期是否比现在晚
  5. @Past 校验给定的日期是否比现在早
  6. @Max检查被标注的属性的值是否小于等于给定的值
  7. @Min检查被标注的属性的值是否大于等于给定的值
  8. @NotNull检验被标注的值不为空
  9. @Null 检验被标注的值为空
  10. @Pattern(regex=,flag=) 检查该字符串是否能够在match指定的情况下被regex定义的正则表达式匹配
  11. @Size(min=,max=) 检查被标注元素的长度
  12. @Valid递归的对关联的对象进行校验

如果是比较短小的参数直接加@NotNull (int)  @NotBlank等就可以了

再或者直接用断言做校验比较简单

public int getUser(String username) {     

 Assert.hasText(username,"用户名不能为空");//用用户名查询用户信息的时候

 }  

其他断言的用法可以直接看Assert里面的方法,一共没几个,可以校验list等!

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/310785
推荐阅读
相关标签
  

闽ICP备14008679号