gpt4 book ai didi

java - getParameterAnnotations 返回空数组

转载 作者:行者123 更新时间:2023-11-30 09:05:59 25 4
gpt4 key购买 nike

我正在为方法参数实现基于 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(...);
}

}

}
}

我尝试使用 null 参数调用 findByRange 并进行调试。调试显示连接点已激活,但 method.getParameterAnnotations() 为每个参数返回一个空数组,就像参数没有注释一样。

如何修复?

最佳答案

找到可行的解决方案

由于我使用了管理器实现设计模式(如您所见,我的 bean 方法被注释为 @Override),我发现让 @NotNull 的方法注解工作是在接口(interface)上注解参数,而不是在具体实现上

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

...
}
}

关于java - getParameterAnnotations 返回空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24626613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com