详解Spring AOP 实现“切面式”valid校验

关于“详解Spring AOP 实现‘切面式’valid校验”的完整攻略,这是一个相对比较复杂的话题,需要我们详细来讲解一下。下面是我的分享:

什么是AOP

AOP,Aspect Oriented Programming,面向切面编程,是OOP(Object Oriented Programming,面向对象编程)的一种补充。其实现是基于代理模式的基础之上的,目的是解决在面向对象编程中切面问题的技术。

Spring AOP

Spring AOP是Spring框架中对AOP实现的扩展,并且是基于代理的方式实现切面(也支持AspectJ编译时的AOP实现方式)。这样我们就可以通过Spring框架对AOP进行解决,消除Weave的依赖。

实现“切面式”valid校验

下面是实现“切面式”valid校验的完整攻略:

  • 1.在maven依赖中添加spring-boot-starter-aop和spring-boot-starter-validation两个包。
  • 2.自定义校验注解,可以通过@Target和@Retention来指定校验注解具体的作用场景和生命周期,可以有多条配置项,例如:
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {IsMobileValidator.class })
public @interface IsMobile {

    String message() default "手机号码格式错误";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    boolean required() default true;
}

其中,@Constraint是JSR303标准的注解,表示该注解是一个校验注解。@validatedBy是配合该注解的校验类。

  • 3.编写校验类,继承ConstrainValidator和初始化方法,例如:
public class IsMobileValidator implements ConstraintValidator<IsMobile, String> {

    private boolean required = false;

    @Override
    public void initialize(IsMobile constraintAnnotation) {
        required = constraintAnnotation.required();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {

        ... // 校验逻辑

        return false;
    }
}

其中,initialize方法的作用是将校验注解上的配置项读取到当前的校验类的成员变量中,isValid方法是校验逻辑的具体实现。这里涉及到的是JSR303标准的校验实现方式,需要了解。

  • 4.编写AOP切面校验处理类。这里采用@Aspect和@Pointcut两个注解来指定切面的实现方式。@Before注解指定切面调用前的操作,例如:
@Aspect
@Component
public class ValidatorAspect {

    @Pointcut("execution(* com.example.demo.service..*.*(..))")
    public void pointcut() {

    }

    @Before("pointcut()")
    public void before(JoinPoint joinPoint) throws Throwable {
        // 取得传参
        Object[] args = joinPoint.getArgs();
        if (args == null || args.length == 0) {
            return;
        }

        // 根据入参做字段校验
        for (Object arg : args) {
            // 校验逻辑
        }
    }
}

好了,至此,我们关于“切面式”valid校验的完整攻略就讲完了,其中包含了自定义注解、校验类、AOP处理类等多个环节的实现,需要认真理解和消化。下面给出两条示例:

示例一:

Account.java

public class Account {

    @NotBlank(message = "姓名不能为空")
    private String name;

    @Min(value = 0, message = "年龄必须大于0")
    @Max(value = 150, message = "年龄不能大于150")
    private Integer age;

    ... // 其他字段

AccountService.java

@Service
public class AccountService {

    public boolean add(Account account) {
        boolean flag = ... // 具体的添加逻辑
        return flag;
    }
}

ValidatorAspect.java

@Aspect
@Component
public class ValidatorAspect {

    @Pointcut("execution(* com.example.demo.service..*.*(..))")
    public void pointcut() {

    }

    @Before("pointcut()")
    public void before(JoinPoint joinPoint) throws Throwable {
        // 取得传参
        Object[] args = joinPoint.getArgs();
        if (args == null || args.length == 0) {
            return;
        }

        // 根据入参做字段校验
        for (Object arg : args) {
            ValidatorUtil.validate(arg);
        }
    }
}

示例二:

LoginRequest.java

public class LoginRequest {
    @NotBlank(message = "用户名不能为空")
    private String username;

    @NotBlank(message = "密码不能为空")
    private String password;

    ... // 其他未含密码的字段
}

LoginController.java

@RestController
@RequestMapping("/login")
public class LoginController {

    @PostMapping("/auth")
    public Result<String> login(HttpServletRequest request, HttpServletResponse response, @Validated LoginRequest loginRequest) {
        ... // 具体的登录逻辑
    }

}

ValidatorAspect.java

@Aspect
@Component
public class ValidatorAspect {

    @Pointcut("execution(* com.example.demo.controller..*.*(..)) && args(.., @Validated *)")
    public void pointcut() {

    }

    @Before("pointcut()")
    public void before(JoinPoint joinPoint) throws Throwable {
        // 取得传参
        Object[] args = joinPoint.getArgs();
        if (args == null || args.length == 0) {
            return;
        }

        // 根据入参做字段校验
        for (Object arg : args) {
            ValidatorUtil.validate(arg);
        }
    }
}

在这两个示例中,我们均通过自定义注解、校验类以及AOP处理类等多个环节的实现,完成了对于“切面式”valid校验的支持。需要注意的是,具体实现方式可能因为版本差异、框架变化等原因存在差异,需要根据具体情况进行调整。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Spring AOP 实现“切面式”valid校验 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Spring Boot 2.0快速构建服务组件全步骤

    Spring Boot是一个流行的Java框架,可以帮助开发人员更加高效地构建和部署应用程序。在本文中,我们将详细讲解如何使用Spring Boot 2.0快速构建服务组件的全步骤,并提供两个示例来演示如何使用Spring Boot 2.0构建服务组件。 Spring Boot 2.0快速构建服务组件全步骤 以下是使用Spring Boot 2.0快速构建服…

    Java 2023年5月15日
    00
  • spring boot使用thymeleaf模板的方法详解

    下面为您提供《Spring Boot使用Thymeleaf模板的方法详解》的完整攻略。 1. Thymeleaf简介 Thymeleaf是一种现代的服务器端Java模板引擎,可以构建HTML、XML、JavaScript、CSS或文本输出。它旨在与Spring框架完全集成,但可以用于处理任何Web和非Web应用程序开发的模板需要。 2. Spring Boo…

    Java 2023年6月15日
    00
  • Java中BigDecimal的加减乘除、比较大小与使用注意事项

    Java中BigDecimal的加减乘除、比较大小与使用注意事项 简介 在Java中,double和float等浮点数类型存在精度问题,会出现计算结果不准确的情况。而BigDecimal是一种高精度的数据类型,它可以解决浮点数计算精度问题。BigDecimal的精度可以达到需要表示的精确度,且不会出现计算误差。因此,在需要高精度计算的场合下,我们通常会使用B…

    Java 2023年5月26日
    00
  • Jackson2的JsonSchema实现java实体类生成json方式

    当使用Jackson2进行Java对象的序列化和反序列化时,我们可以使用Jackson2的JsonSchema功能来生成Java实体类的JSON描述。这些描述包括属性的标识符、类型和其他约束。它们可以用于生成文档、验证和其他用途。 以下是使用Jackson2的JsonSchema生成Java实体类的步骤: 步骤1. 添加依赖 要使用Jackson2的Json…

    Java 2023年5月26日
    00
  • Java算法练习题,每天进步一点点(1)

    首先,对于这篇题解的标题,可以使用一二级标题展示: Java算法练习题,每天进步一点点(1) 题意说明 本练习题题目数量较多,可根据自己的情况自行选择练习。本文以题目1为例: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例1: 输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示…

    Java 2023年5月19日
    00
  • Springboot热部署实现原理及实例详解

    Spring Boot 热部署实现原理及实例详解 什么是热部署 热部署(Hot swapping)是指在应用程序运行时,无需停止或重启应用程序,就可以实时更新部分或全部代码和配置。热部署可以提高应用程序的开发和测试效率,缩短开发和测试的周期,特别是对于大型项目和复杂项目来说,效果尤为明显。 Spring Boot 热部署实现原理 Spring Boot 应用…

    Java 2023年5月19日
    00
  • Log4j2 重大漏洞编译好的log4j-2.15.0.jar包下载(替换过程)

    针对“Log4j2 重大漏洞编译好的log4j-2.15.0.jar包下载(替换过程)”这个问题,我来给出完整的攻略。大致流程如下: 下载log4j-2.15.0.jar包 查找使用Log4j2进行日志记录的应用程序 停止应用程序 将原来的log4j-core jar包和log4j-api jar包替换成log4j-2.15.0.jar包 重新启动应用程序,…

    Java 2023年5月20日
    00
  • java中读写Properties属性文件公用方法详解

    Java中读写Properties属性文件公用方法详解 什么是Properties属性文件? Properties属性文件是Java中常用的一种配置文件,使用键值对的形式来保存配置数据。通常我们将应用程序中需要用户自行配置的数据以及程序运行时需要用到的配置数据都存储在Properties属性文件中进行统一管理。这种文件通常采用.properties扩展名。 …

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部