声明类型不能为null

时间:2014-04-18 08:19:16

标签: java spring validation null annotations

我使用Spring's Bean validation来处理null参数并在方法声明中返回值。

示例:

@Validated
public interface MyService {
    @NotNull User createNewUser(@NotNull Username username, @NotNull Password password);
}

其中UsernamePassword只是用户名和密码字符串的包装,User是代表用户帐户的类,@NotNull是{{ 1}}。

实际上,javax.validation.constraints.NotNull有更多方法,还有其他类我决定使用MyService声明其参数和返回类型,如上例所示。但后来我认为我的代码远非优雅,因为它充满了样板@NotNull声明。

所以我认为如果能做到这一点会很棒,

@NotNull

并期望@NotNull public class Username {...} @NotNull public class User {...} @NotNull public class Password {...} UsernamePassword等类型的变量不能User,因此我不会这样做必须在其他地方重复使用null的变量。(实际上,@NotNull注释不允许与类声明一起使用)

是否有可能在某些方面实现这一目标?

1 个答案:

答案 0 :(得分:1)

这样的注释最终会在注释方法周围设置代理。由于你想进行空检查,你将无法代理甚至没有创建的对象:)所以我认为你所能做的就是使用Spring AOP定义一个代理,围绕使用 Username的所有方法密码作为参数。请参阅Spring doc中的 args 选项。 你可能会得到这样的东西(没有经过测试):

<aop:config>
  <aop:aspect id="nullValidation" ref="nullValidatorAspect">
    <aop:around pointcut="args(foo.bar.Username,..)" method="validateNull"/>
    <aop:around pointcut="args(foo.bar.Password,..)" method="validateNull"/>
  </aop:aspect>
</aop:config>

你的 NullValidatorAspect 类将有一个像这样的方法。这部分很棘手,因为您收到空值后无法使用 instanceof 来验证参数的类型。因此,要么针对null验证所有参数:

public Object validateNull(ProceedingJoinPoint pjp) {
  Object[] args = pjp.getArgs(); 
  for ( Object arg : args ) {
     //not null validation
  }
  pjp.proceed();
}

...或者你深入挖掘并在方法签名周围应用一些逻辑(比如在参数类型数组的参数数组上并行执行)

final MethodSignature methodSignature = (MethodSignature)pjp.getSignature();
Method method = methodSignature.getMethod();
Class<?>[] paramTypes = method.getParameterTypes());

希望这有帮助, 盖尔盖伊