getParameterAnnotations返回空数组

时间:2014-07-08 08:03:59

标签: java spring validation annotations spring-aop

我正在为方法参数实现一个基于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()为每个参数返回一个空数组,但参数未注释。

如何解决?

1 个答案:

答案 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

        ...
    }
}