2012-03-19 57 views
1

我創建了以下注釋回暖:Grails領域類註解不是在控制器

public @interface NavAnnotation { 

    boolean addToAdminMenu() default false; 

} 

...然後嘗試註釋域類:

@NavAnnotation (addToAdminMenu = true) 
class Information {...} 

...和做在控制器中的東西:

def appDomainClasses = grailsApplication.domainClasses.findAll { 
    it.class.isAnnotationPresent(NavAnnotation) 

} 
[ appDomainClasses : appDomainClasses ] 

...但是那個帶註釋的類沒有被拾起。關於我失蹤的任何想法?

回答

3

夫婦的事情...

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

+0

...今晚會做和更新。 – vector 2012-03-19 12:56:03

+0

...剛剛添加 @Target(ElementType.ANNOTATION_TYPE) @Retention(RetentionPolicy.RUNTIME)但沒有歡樂 – vector 2012-03-19 23:30:18

+0

您的目標應該是CLASS,因爲您註釋了一個類。請在運行時顯示註釋的println結果。 – 2012-03-20 09:17:02