我创建了以下注释:
public @interface NavAnnotation {
boolean addToAdminMenu() default false;
}
...然后尝试注释域类:
@NavAnnotation ( addToAdminMenu = true )
class Information {...}
...并在控制器中执行此操作:
def appDomainClasses = grailsApplication.domainClasses.findAll {
it.class.isAnnotationPresent( NavAnnotation )
}
[ appDomainClasses : appDomainClasses ]
...但是这个带注释的课程没有被提起。关于我缺少的任何想法?
答案 0 :(得分:4)
情侣......
1.确保您的注释的保留政策为@Retention(RetentionPolicy.RUNTIME)
。 RUNTIME保留策略允许注释在运行时可用于反射。所以你的界面应该看起来像....
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface NavAnnotation {
boolean addToAdminMenu() default false;
}
2。)grailsApplication.domainClasses
会返回DefaultGrailsDomainClass
,而不是您想要进行反射的实际课程。相反,你想使用像这样的getClazz()方法来访问下划线类。
def appDomainClasses = grailsApplication.domainClasses.findAll {
it.getClazz().isAnnotationPresent( NavAnnotation )
}
我已经测试确认它有效。享受!
-Thanks