找回密码
 立即注册
查看: 489|回复: 0

[后端] 非Controller控制层参数校验怎么办

[复制链接]

224

主题

0

回帖

773

积分

高级会员

积分
773
发表于 2024-6-13 13:57:21 | 显示全部楼层 |阅读模式
本帖最后由 御坂主机 于 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 创建校验注解和校验器

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

  1. import javax.validation.Constraint;
  2. import javax.validation.Payload;
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;

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

  15. import javax.validation.ConstraintValidator;
  16. import javax.validation.ConstraintValidatorContext;

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

  20.     @Override
  21.     public boolean isValid(String value, ConstraintValidatorContext context) {
  22.         return value != null && value.matches("[a-zA-Z0-9]+");
  23.     }
  24. }
复制代码


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

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

  1. public class MyService {

  2.     public void process(@MyConstraint String input) {
  3.         // 业务逻辑
  4.     }
  5. }
复制代码


2.3 手动触发校验

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

  1. import org.springframework.stereotype.Service;

  2. import javax.validation.ConstraintViolation;
  3. import javax.validation.Validation;
  4. import javax.validation.Validator;
  5. import java.util.Set;

  6. @Service
  7. public class MyService {

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

  9.     public void process(String input) {
  10.         Set<ConstraintViolation<MyService>> violations = validator.validateProperty(this, "input");
  11.         if (!violations.isEmpty()) {
  12.             throw new IllegalArgumentException("Invalid parameter: " + violations.iterator().next().getMessage());
  13.         }
  14.         // 业务逻辑
  15.     }
  16. }
复制代码


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

3.1 创建AOP切面

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

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

  4. import javax.validation.Validation;
  5. import javax.validation.Validator;

  6. @Aspect
  7. @Component
  8. public class ValidationAspect {

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

  10.     @Before("execution(* com.example.service.*.*(..)) && args(param,..)")
  11.     public void validate(Object param) {
  12.         Set<ConstraintViolation<Object>> violations = validator.validate(param);
  13.         if (!violations.isEmpty()) {
  14.             throw new IllegalArgumentException("Invalid parameter: " + violations.iterator().next().getMessage());
  15.         }
  16.     }
  17. }
复制代码


3.2 应用AOP切面

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

  1. import org.springframework.stereotype.Service;

  2. @Service
  3. public class MyService {

  4.     public void process(String input) {
  5.         // 业务逻辑
  6.     }
  7. }
复制代码


4. 总结

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




------------------------------------------------------------------------------------------------------------------------------------------

========  御 坂 主 机  ========

>> VPS主机 服务器 前沿资讯 行业发布 技术杂谈 <<

>> 推广/合作/找我玩  TG号 : @Misaka_Offical <<

-------------------------------------------------------------------------------------------------------------------------------------------



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系站长|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-4-4 13:34 , Processed in 0.063465 second(s), 24 queries .

Powered by 主机论坛 HostSsss.Com

HostSsss.Com

快速回复 返回顶部 返回列表