我正在为方法参数实现一个基于AOP的验证机制。当我为方法参数指定@NotNull
注释时,我确保它不为null或抛出异常。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface NotNull
{
}
目标Spring bean注释方法
@Override
public PagedCollection<Result> findByRange(@NotNull BigInteger start, @NotNull BigInteger end)
{
if (start.compareTo(end) > 0)
throw new IllegalArgumentException("a > b"); // I haven't yet created an annotation for that
...
}
方面代码
@Before("execution(public * myapp.managers.spring.*.*(..))")
public void before(JoinPoint jp) throws Throwable
{
MethodSignature signature = (MethodSignature) jp.getSignature();
Method method = signature.getMethod();
before(method, jp.getArgs(), jp.getTarget());
}
public void before(Method method, Object[] args, Object target)
throws Throwable
{
Annotation[][] methodAnnotations = method.getParameterAnnotations();
if (args != null)
{
for (int i = 0; i < args.length; i++)
{
for (Annotation annotation : methodAnnotations[i])
{
if (annotation.annotationType() == NotNull.class)
if (args[i] == null)
throw new IllegalArgumentException(...);
}
}
}
}
我尝试使用findByRange
参数调试null
并进行调试。 Debug显示连接点已激活,但method.getParameterAnnotations()
为每个参数返回一个空数组,但参数未注释。
如何解决?
答案 0 :(得分:2)
由于我使用了管理器实现设计模式(因为你可以看到我的bean方法有注释@Override
),我发现让@NotNull
注释工作的方法是来注释接口上的参数,而不是具体的实现
public interface {
public PagedCollection<Result> findByRange(@NotNull BigInteger start, @NotNull BigInteger end);
}
public class MyServiceImpl implements MyService
@Override
public PagedCollection<Result> findByRange(BigInteger start, BigInteger end)
{
if (start.compareTo(end) > 0)
throw new IllegalArgumentException("a > b"); // I haven't yet created an annotation for that
...
}
}