Java笔记 #07# Hibernate Validator

Hibernate Validator是Spring Boot默认附带的标准校验API(javax.validation)实现。

应用实例(配合切面)

采用注解定义切面.java

@Aspect
@Configuration
public class ParameterValidator {

    private ExecutableValidator executableValidator;

    public ParameterValidator() {
        // 开启快速失败返回模式(顾名思义...)
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).
                configure().addProperty("hibernate.validator.fail_fast", "true" ).
                buildValidatorFactory();
        executableValidator = validatorFactory.getValidator().forExecutables();
    }

    @Pointcut("execution(public * org.sample.website.service.impl.*.*(..))")
    public void serviceMethod() {}

    @Around("serviceMethod()")
    public Object validate(ProceedingJoinPoint jp) throws Throwable {
        Method method = ((MethodSignature) jp.getSignature()).getMethod();
        Set<ConstraintViolation<Object>> violations = executableValidator.validateParameters(jp.getThis(), method, jp.getArgs());
        if (!violations.isEmpty()) {
            throw new ValidationException(violations.iterator().next().getMessage());
        }
        return jp.proceed();
    }
}

PS.  ValidationException是标准API中定义的运行时异常

/

接口.java

public interface MessageService {

    // 单独校验参数
    Message leaveMessage(@NotNull(message = "昵称不能为空") String nickname,
                         @NotNull(message = "内容不能为空") String content);

    Message leaveMessage(@Valid Message message); // 校验实体

    List<Message> listMessage(int offset, int limit);
}

/

参数中的实体只有在@Valid(递归校验符)标注后才会被校验:

public class Message {

    private Long id;
    private String nickname;
    @NotNull(message = "内容不能为空!")
    private String content;

    public Message() {
    }

/

测试代码片段(Spring环境):

        String nickname = "test" + (int) (Math.random() * 10);
        messageService.leaveMessage(new Message(nickname, null));

运行结果:

javax.validation.ValidationException: 内容不能为空!

    at org.sample.website.aspect.ParameterValidator.validate(ParameterValidator.java:39)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)

参考资料

转载于:https://www.cnblogs.com/xkxf/p/10386809.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值