我使用Spring's Bean validation来处理null
参数并在方法声明中返回值。
示例:
@Validated
public interface MyService {
@NotNull User createNewUser(@NotNull Username username, @NotNull Password password);
}
其中Username
和Password
只是用户名和密码字符串的包装,User
是代表用户帐户的类,@NotNull
是{{ 1}}。
实际上,javax.validation.constraints.NotNull
有更多方法,还有其他类我决定使用MyService
声明其参数和返回类型,如上例所示。但后来我认为我的代码远非优雅,因为它充满了样板@NotNull
声明。
所以我认为如果能做到这一点会很棒,
@NotNull
并期望@NotNull
public class Username {...}
@NotNull
public class User {...}
@NotNull
public class Password {...}
,Username
,Password
等类型的变量不能User
,因此我不会这样做必须在其他地方重复使用null
的变量。(实际上,@NotNull
注释不允许与类声明一起使用)
是否有可能在某些方面实现这一目标?
答案 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());
希望这有帮助, 盖尔盖伊