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

相关文章

  • JAVA中JSONObject对象和Map对象之间的相互转换

    在Java中,JSONObject对象和Map对象是两种常用的数据结构,本篇攻略将介绍JSONObject对象和Map对象相互转换的方法。 什么是JSONObject对象和Map对象 JSONObject对象 JSONObject 是一个能够存储 key-value 映射的简单的开放解决方案。 JSONObject 的 constructor 支持通过传入一…

    Java 2023年5月26日
    00
  • Spring Boot启动流程分析

    我来为您讲解关于“SpringBoot启动流程分析”的完整攻略。 SpringBoot启动流程分析 SpringBoot是基于Spring的一个快速开发新一代Java框架,其简化了Spring应用的开发流程,同时也隐藏了Spring框架配置的复杂性,在不需要过多配置的情况下,实现快速搭建Spring应用。 SpringBoot应用的启动过程可以分为以下几个步…

    Java 2023年5月15日
    00
  • Java使用黑盒方式模拟实现内网穿透

    Java使用黑盒方式模拟实现内网穿透攻略 什么是内网穿透? 内网穿透是一种技术,可以将内部网络中的服务通过外部的网络进行访问,在开发或实际运维中,内网穿透被广泛应用。 黑盒方式模拟内网穿透 黑盒方式模拟内网穿透的实现,即通过模拟一个中间站点来实现服务的穿透,让外部网络能够访问内部网络中的服务。可以使用Java语言实现。 实现步骤 从外部网络连接模拟中间站点。…

    Java 2023年5月24日
    00
  • Java执行JavaScript代码

    下面是Java执行JavaScript代码的完整攻略,包含两条示例说明。 1. 前置知识 在执行JavaScript代码前,需要先了解几个概念: 版本:Java需要使用1.7及以上版本才能支持JavaScript 引擎:Java中通常使用Rhino或Nashorn引擎执行JavaScript代码 接口:Java提供了脚本引擎接口,用于在Java中执行Java…

    Java 2023年5月26日
    00
  • 标记-复制算法的作用是什么?

    以下是关于标记-复制算法的详细讲解: 什么是标记-复制算法? 标记-复制算法是一种常见的垃圾回收算法。它的原理是将内存空间分为两个区域,一部分为活动区,一部分为闲置区。在程序运行程中,标记所有不再使用的内存空间,然后将所有活动区的对象复制到闲置区,最后清空动区,从而回收内存空间。标记-复制算法分两个阶段:标记阶段和复制阶段。 记段在标记阶段,垃圾回收器会遍历…

    Java 2023年5月12日
    00
  • Java动态数组Arraylist存放自定义数据类型方式

    Java的动态数组ArrayList是一种可以调整大小的可变数组,它可以动态地添加、删除和修改元素,非常方便。如果要在ArrayList中存放自定义数据类型的元素,需要进行以下步骤: 1. 自定义数据类型的类定义 首先要定义一个类来表示自定义数据类型,该类需要实现Java中的Serializable 接口,以便可以进行序列化。 示例代码: import ja…

    Java 2023年5月26日
    00
  • Java实现操作JSON的便捷工具类完整实例【重写Google的Gson】

    Java实现操作JSON的便捷工具类完整实例【重写Google的Gson】 什么是JSON JSON(JavaScript Object Notation),一种轻量级的数据交换格式。以键值对(key-value pairs)的形式表示信息,易于人阅读和编写,同时也易于机器解析和生成。 为什么需要JSON 如今,网络数据交互已经成为了不可避免的事实。在这个过…

    Java 2023年5月26日
    00
  • 详解Spring Security中权限注解的使用

    详解Spring Security中权限注解的使用 概述 在使用Spring Security处理权限控制时,通常有两种方式: 基于URL拦截,对每个URL设置对应的权限 基于注解,对Controller或方法设置对应的权限 本篇攻略将详细讲解如何使用Spring Security中的权限注解进行权限控制。 Spring Security中的权限注解 Spr…

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