爱看书的阿东

赐他一块白色石头,石头上写着新名

使用Hibernate JSP 303 整合到SSM项目

需求:

  1. 在项目中加入注解校验
  2. 可以控制错误的操作
  3. 对于参数错误进行全局日志记录,方便后续查看

使用Hibernate JSP 303 整合到项目

https://juejin.im/post/5d3fbeb46fb9a06b317b3c48

https://zhuanlan.zhihu.com/p/49589845

ValidataUtils

此工具类配置可以大大减少配置https://github.com/hjzgg/usually_util/blob/master/spring-validate-demo/validator/ValidatorUtils.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Bean
public Validator validator() {
return new LocalValidatorFactoryBean();
}
@Component
public class ValidatorUtils implements ApplicationContextAware {

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ValidatorUtils.validator = (Validator) applicationContext.getBean("validator");
}

private static Validator validator;

public static Optional<String> validateResultProcess(Object obj) {
Set<ConstraintViolation<Object>> results = validator.validate(obj);
if (CollectionUtils.isEmpty(results)) {
return Optional.empty();
}
StringBuilder sb = new StringBuilder();

for (Iterator<ConstraintViolation<Object>> iterator = results.iterator(); iterator.hasNext(); ) {
sb.append(iterator.next().getMessage());
if (iterator.hasNext()) {
sb.append(" ,");
}
}
return Optional.of(sb.toString());
}
}

自定义校验器

https://www.jb51.net/article/174064.htm

自定义校验规则:

https://songwell1024.github.io/2018/08/02/JSR303/

解决思路:

第一种:使用@Valid 加上 BindResult

注意事项: @valid 加入的DTO后面必须跟上 BindResult

1
@valid` 加入的DTO后面必须跟上 `BindResult``@valid` 加入的DTO后面必须跟上 `BindResult

,如果不按此规则,将会由Spring的 bindException 直接抛出异常

第二种:使用切面的方式统一处理异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Aspect
@Component
public class ControllerValidatorInterceptor {

/**
* 设置 around 环绕通知切面
*/
@Around("execution(* com.aerexu.web.*.*(..)) && args(..,bindingResult)")
public Object doAround(ProceedingJoinPoint pjp, BindingResult bindingResult) throws Throwable {
Object retVal;
if (bindingResult.hasErrors()) {
retVal = doErrorHandle();
} else {
retVal = pjp.proceed();
}
return retVal;
}
}

实用bindResult 到最佳实践

https://vimsky.com/zh-tw/examples/detail/java-class-org.springframework.validation.BindingResult.html

真的写的十分好,这里分享出来

常用注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Null  被注释的元素必须为null
@NotNull 被注释的元素不能为null
@AssertTrue 被注释的元素必须为true
@AssertFalse 被注释的元素必须为false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max,min) 被注释的元素的大小必须在指定的范围内。
@Digits(integer,fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式。
@Email 被注释的元素必须是电子邮件地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串必须非空
@Range 被注释的元素必须在合适的范围内