我正在尝试编写一个ArchUnit测试规则,它应该确保使用@ComponentInterface
注释的接口具有使用@Input
注释注释的方法参数。像这样:
ArchRule rule =
methods()
.that()
.areDeclaredInClassesThat()
.areInterfaces()
.and()
.areDeclaredInClassesThat()
.areAnnotatedWith(ComponentInterface.class)
.should()
.haveRawParameterTypes(
allElements(CanBeAnnotated.Predicates.annotatedWith(Input.class)));
界面如下所示:
@ComponentInterface
public interface AdminComponent {
void login(@Input(name = "loginString") String loginString);
}
但测试失败,出现如下错误:方法
在这种情况下,规则应该如何正常工作?
附言:在做了一些调试后,发现haveRawParameterTypes检查参数类型(类)是否有注释,而不是方法参数本身。所以它查看String类并发现它没有用@Input注释。很高兴知道,但这并不能解决问题。
您可以始终回退到反射API:
ArchRule rule = methods()
.that().areDeclaredInClassesThat().areInterfaces()
.and().areDeclaredInClassesThat().areAnnotatedWith(ComponentInterface.class)
.should(haveAllParametersAnnotatedWith(Input.class));
ArchCondition<JavaMethod> haveAllParametersAnnotatedWith(Class<? extends Annotation> annotationClass) {
return new ArchCondition<JavaMethod>("have all parameters annotated with @" + annotationClass.getSimpleName()) {
@Override
public void check(JavaMethod method, ConditionEvents events) {
boolean areAllParametersAnnotated = true;
for (Annotation[] parameterAnnotations : method.reflect().getParameterAnnotations()) {
boolean isParameterAnnotated = false;
for (Annotation annotation : parameterAnnotations) {
if (annotation.annotationType().equals(annotationClass)) {
isParameterAnnotated = true;
}
}
areAllParametersAnnotated &= isParameterAnnotated;
}
String message = (areAllParametersAnnotated ? "" : "not ")
+ "all parameters of " + method.getDescription()
+ " are annotated with @" + annotationClass.getSimpleName();
events.add(new SimpleConditionEvent(method, areAllParametersAnnotated, message));
}
};
}
我对模型映射器进行了以下配置,以将用户类的实例转换为扩展getuserdto的实例。 在注释掉setReceivedExpense之前,我收到了这个错误: 在花费了一些时间并没有找到根本原因之后,我试图删除DTO中所有可疑的循环依赖项(我在GetExpenseDto中引用了GetExpenseDto,expenseDtoConverter的返回结果),我仍然收到相同的错误,我注释掉了map()。s
我正在编写一个可序列化的类,它接受多个参数,包括一个函数: 存储在成员变量中,因此需要可序列化。如果分配给它们的类型是可序列化的,则Javalambda是可序列化的。如果使用lambda创建,那么确保在构造函数中传递的是可序列化的最佳方法是什么? > 创建一个可序列化函数,并使用该函数: 问题: 现在,
问题内容: 我刚刚开始在Java 8中使用注释,并得到了一些意外的结果。 我有这样的方法: 我编写了一个JUnit测试,为参数searchList传递了空值。我原以为会发生某种类型的错误,但好像没有注释就通过了。这是预期的行为吗?据我了解,这是允许您跳过编写样板空检查代码。 对于@NotNull应该做什么的解释将不胜感激。 问题答案: 和自己做什么。它们应该充当文档工具。 该注释提醒您在以下情况下
我编写了一个JUnit测试,为参数searchingList传入null值。我原以为会发生某种类型的错误,但结果好像注释不在那里一样。这是意料之中的行为吗?根据我的理解,这是允许您跳过编写样板空校验代码。 如果能解释一下@NotNull到底应该做什么,将会非常感谢。
我希望在没有参数的方法上有注释。在这种情况下,我使用@Cacheable,如下所示 然而,当我调用这个方法时,它没有被执行,而是得到了如下的异常 org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): 在 'org.springframework.cache.interceptor.CacheExp
问题内容: 而且我正在尝试更改方法注释,但是java.lang.reflect.Method不包含任何地图字段(例如“ annotations”)或方法(例如“ getDeclaredAnnotationMap”) 只有但是我可以用这个字节数组做什么? 那么,如何修改方法的注释呢? 编辑: 我创建了:http : //pastebin.com/T2rewcwU 但是,仅编辑此方法实例,如果取消注释