御坂主机 发表于 2024-6-13 13:57:21

非Controller控制层参数校验怎么办

本帖最后由 御坂主机 于 2024-6-13 14:46 编辑

1. 引言

在Web开发中,参数校验是确保数据有效性和系统稳定性的重要手段。通常我们会在Controller层进行参数校验,但有时候我们需要在Service层、Repository层甚至更深层次进行校验。本文将探讨在非Controller控制层进行参数校验的方法和实践。

1.1 为什么需要在非Controller层进行校验

在某些场景下,参数校验不仅仅是Controller层的职责。例如:

(1) 参数在不同层之间传递,某些层对参数有特定的校验要求。
(2) 某些业务逻辑需要在Service层进行复杂的校验。
(3) 在多个地方调用同一个方法,希望统一进行参数校验。

2. 使用Validator进行参数校验

Java自带的javax.validation包提供了强大的校验功能。我们可以结合Spring的@Valid注解在任何层次进行参数校验。

2.1 创建校验注解和校验器

首先,我们需要创建自定义的校验注解和对应的校验器。

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Constraint(validatedBy = MyConstraintValidator.class)
@Target({ ElementType.FIELD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface MyConstraint {
    String message() default "Invalid parameter";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class MyConstraintValidator implements ConstraintValidator<MyConstraint, String> {
    @Override
    public void initialize(MyConstraint constraintAnnotation) {}

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
      return value != null && value.matches("+");
    }
}

2.2 在参数中使用自定义注解

接下来,我们可以在需要校验的参数上使用自定义注解。

public class MyService {

    public void process(@MyConstraint String input) {
      // 业务逻辑
    }
}

2.3 手动触发校验

在Service层手动触发参数校验:

import org.springframework.stereotype.Service;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;

@Service
public class MyService {

    private final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

    public void process(String input) {
      Set<ConstraintViolation<MyService>> violations = validator.validateProperty(this, "input");
      if (!violations.isEmpty()) {
            throw new IllegalArgumentException("Invalid parameter: " + violations.iterator().next().getMessage());
      }
      // 业务逻辑
    }
}

3. 使用Spring AOP进行参数校验

3.1 创建AOP切面

通过Spring AOP,我们可以在方法执行之前进行参数校验。

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import javax.validation.Validation;
import javax.validation.Validator;

@Aspect
@Component
public class ValidationAspect {

    private final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

    @Before("execution(* com.example.service.*.*(..)) && args(param,..)")
    public void validate(Object param) {
      Set<ConstraintViolation<Object>> violations = validator.validate(param);
      if (!violations.isEmpty()) {
            throw new IllegalArgumentException("Invalid parameter: " + violations.iterator().next().getMessage());
      }
    }
}

3.2 应用AOP切面

在Service方法上,我们可以自动进行参数校验。

import org.springframework.stereotype.Service;

@Service
public class MyService {

    public void process(String input) {
      // 业务逻辑
    }
}

4. 总结

在非Controller控制层进行参数校验可以确保数据的一致性和安全性。通过使用javax.validation包和Spring AOP,我们可以灵活地在不同层次上进行参数校验,满足复杂的业务需求。希望本文能够帮助你在实际项目中更好地实现参数校验功能。




------------------------------------------------------------------------------------------------------------------------------------------
========御 坂 主 机========
>> VPS主机 服务器 前沿资讯 行业发布 技术杂谈 <<
>> 推广/合作/找我玩TG号 : @Misaka_Offical <<
-------------------------------------------------------------------------------------------------------------------------------------------


页: [1]
查看完整版本: 非Controller控制层参数校验怎么办