spring方法验证中如何验证方法参数默认为NotNull?

Posted

技术标签:

【中文标题】spring方法验证中如何验证方法参数默认为NotNull?【英文标题】:How validate method parameters are NotNull by default in spring method validation? 【发布时间】:2019-04-22 23:15:09 【问题描述】:

Here 是有关方法验证的示例。所以检查方法参数是否为空我必须编写以下内容:

import org.springframework.validation.annotation.Validated

@Validated
public class SomeClass 
    public void myMethod(@NotNull Object p1, @Nullable Object p2) 

有没有办法设置spring bean验证以使所有参数默认验证为@NotNull?例如。当p1null 时,以下将失败:

import org.springframework.validation.annotation.Validated

@Validated
public class SomeClass 
    public void myMethod(Object p1, @Nullable Object p2) 

有什么想法吗?

【问题讨论】:

你到底想达到什么目标? 减少方法参数的注解。 【参考方案1】:

如果您希望 Spring 自动验证方法参数,请执行以下操作:

    org.hibernate.validator:hibernate-validator 添加到您的依赖项中 用@javax.validation.constraints.NotNull标记所需的方法参数

那么当你调用这样的方法并且没有提供所需的参数时,你会得到一个javax.validation.ConstraintViolationException 异常。

另一种更简单的方法是使用 Lombok 的:只需用 @lombok.NonNull 标记方法参数,Lombok 将完成剩下的工作。

【讨论】:

mark the required methods with 这是我想跳过的内容,不管是 spring 还是 hgibernate 验证。 @Cherry 你希望所有方法参数都默认是必需的吗?【参考方案2】:

您可以编写自己的@NotNullArgs 注解作为选项

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NotNullArgs 

和方面:

@Aspect
@Component
public class ArgumentMatcher 

  @Around(value = "@annotation(NotNullArgs)")
  public Object verifyAuthorities(ProceedingJoinPoint joinPoint) throws Throwable 
     final Optional<Object> nullArg = Arrays.stream(joinPoint.getArgs())
       .filter(Objects::isNull)
       .findFirst();

     if (nullArg.isPresent() && joinPoint.getArgs().length > 0) 
       throw new IllegalArgumentException(); // or NPE
      else 
       return joinPoint.proceed();
     
  

那么你可以这样使用它:

@NotNullArgs
void methodToCall(Obj arg1, Obj arg2)  .... 

这只是一个草稿,但您可以以此代码为起点

【讨论】:

以上是关于spring方法验证中如何验证方法参数默认为NotNull?的主要内容,如果未能解决你的问题,请参考以下文章

spring 方法验证参数

使用 Spring Reactive 时如何验证 Mono

如何验证某些模板 *not* 为给定的参数类型编译?

如何在spring-servlet.xml内设置拦截器不对上传控制器进行验证

Laravel 5.1 使用默认身份验证控制器和中间件尝试使用额外参数进行身份验证

Spring Boot REST 验证错误响应