详解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日

相关文章

  • idea中引入了gb2312编码的文件的解决方法

    下面是关于在IDEA中引入了GB2312编码的文件的解决方法的完整攻略: 标题 首先,需要了解一些关于编码的基础知识。GB2312是一种汉字编码,它包含了常用的中文汉字,但不支持很多生僻字和繁体字。在IDEA中,我们可能需要引入一些使用了GB2312编码的文件,但是默认的编码是UTF-8,如果我们不做任何处理,那么就会出现乱码的情况。接下来就让我们看看具体的…

    Java 2023年5月20日
    00
  • Java安全之Tomcat6 Filter内存马问题

    Java安全之Tomcat6 Filter内存马问题完整攻略 背景 Tomcat是一个开放源代码的Web应用服务器,支持多种Web开发技术,包括Java Servlet、JavaServer Pages(JSP)和JavaServer Faces(JSF)等。然而,在使用Tomcat时,可能会存在一些安全问题,比如内存马问题。本篇攻略旨在详细介绍Tomcat…

    Java 2023年6月2日
    00
  • 搭建java WEB开发环境和应用

    搭建Java Web开发环境和应用攻略 环境 搭建Java Web开发环境需要的软件包括: JDK(Java Development Kit) IDE(Integrated Development Environment) Tomcat(Web服务器) MySQL(关系型数据库) JDK JDK是Java开发SDK,是Java程序员开发Java程序的必备软件…

    Java 2023年5月19日
    00
  • MyBatis-Plus简介和快速入门教程

    MyBatis-Plus简介和快速入门教程 简介 MyBatis-Plus是基于MyBatis的增强工具,提供了常用的增删改查、分页、乐观锁、逻辑删除等功能,简化了开发人员的工作,提高了开发效率。同时 MyBatis-Plus 也支持 Lambda 表达式查询、自动代码生成等高级功能。 MyBatis-Plus 的主要特点如下: 支持自动生成代码; 内置通用…

    Java 2023年5月20日
    00
  • SpringMVC+EasyUI实现页面左侧导航菜单功能

    概述 要实现页面左侧导航菜单功能,我们需要用到SpringMVC和EasyUI框架。具体实现过程包括以下步骤: 配置SpringMVC框架; 配置EasyUI框架和主题样式; 实现导航菜单的数据获取和展示。 配置SpringMVC框架 SpringMVC是Spring框架中的一个模块,主要用于构建Web应用程序。要配置SpringMVC框架,需要在web.x…

    Java 2023年6月16日
    00
  • Java web实现头像上传以及读取显示

    下面我将为您详细讲解如何使用Java web实现头像上传以及读取显示的完整攻略。 1. 准备工作 在开始实现之前,需要确保您已经有如下几个基本的环境: 开发环境:Eclipse或者IntelliJ IDEA 服务器环境:Tomcat 数据库:MySQL 同时,需要引入如下两个库: commons-fileupload-1.3.1.jar commons-io…

    Java 2023年5月20日
    00
  • spring cloud-给Eureka Server加上安全的用户认证详解

    下面是详细的攻略过程,分为三个部分:Eureka Server的基础配置、添加Spring Security的依赖、配置Spring Security的用户认证。 基础配置 首先需要创建一个基础的Eureka Server服务,可以在pom.xml文件中直接添加以下依赖: <dependency> <groupId>org.sprin…

    Java 2023年6月3日
    00
  • Java实现的矩阵乘法示例

    以下是“Java实现的矩阵乘法示例”的完整攻略。 什么是矩阵乘法 矩阵乘法是指将两个矩阵相乘得到一个新的矩阵的运算。设有两个矩阵A和B,它们的行数和列数分别为$m_1$、$n_1$和$m_2$、$n_2$,如果$n_1=m_2$,则可以将它们相乘得到一个新的矩阵C,C的行数为$m_1$,列数为$n_2$。 Java实现矩阵乘法的过程 要实现矩阵乘法,我们可以…

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