2011-06-16 63 views
2

我有一個註釋,定義爲這樣:我有一個的Restlet ServerResource定義爲這樣無法檢索通過反射從AspectJ的建議私人註釋

public @interface RestletResourceVariable { 
    String name(); 
} 

public class QuestionResource extends ServerResource { 
    static Logger logger = LoggerFactory.getLogger(QuestionResource.class); 

    @RestletResourceVariable(name="questionId") 
    public String questionId; 

    @Get("json") 
    public JsonRepresentation doGet() { 
     logger.info("QuestionResource::doGet()"); 

     return new JsonRepresentation("{ nil };"); 
    } 

    @Post 
    public Representation doPost(Representation entity) throws Exception { 
     logger.info("QuestionResource::doPost:" + entity.getText()); 
     return null; 
    } 
} 

這裏是我的方面:

public aspect RestletResourceVariableAspect { 
    static Logger logger = LoggerFactory.getLogger(RestletResourceVariableAspect.class); 

    pointcut RESTMethods() : 
     execution(@org.restlet.resource.Delete * packagename..*(..)) || 
     execution(@org.restlet.resource.Get * packagename..*(..)) || 
     execution(@org.restlet.resource.Post * packagename..*(..)) || 
     execution(@org.restlet.resource.Put * packagename..*(..)) 
     ; 

    before(): RESTMethods() { 
     Signature sig = thisJoinPoint.getSignature(); 

     Object target = thisJoinPoint.getTarget(); 
     Class<?> c = target.getClass(); 
     Class<?> cdecl = sig.getDeclaringType(); 

     logger.info("Class name: {} cdecl {}", c.getName(), cdecl.getName()); 
     logger.info("Sig: {} in class {}", sig.getName(),sig.getDeclaringType().getName()); 
     Field[] fields = cdecl.getDeclaredFields() ; 
     for (Field field : fields) { 
      logger.info("Field name: {}", field.getName()); 
      Annotation[] annotations = field.getDeclaredAnnotations(); 
      logger.info("Annotations {} length {}", annotations, Integer.toString(annotations.length)); 
      for(Annotation annotation : annotations){ 

       if(annotation instanceof RestletResourceVariable){ 
        RestletResourceVariable myAnnotation = (RestletResourceVariable) annotation; 
        System.out.println("name: " + myAnnotation.name()); 
       } 
      } 

     } 
    } 
} 

我得到輸出,像這樣:

16:22:11.656 [[email protected]] INFO RestletResourceVariableAspect - Class name: QuestionResource cdecl QuestionResource 
16:22:11.656 [[email protected]] INFO RestletResourceVariableAspect - Sig: doGet in class QuestionResource 
16:22:11.656 [[email protected]] INFO RestletResourceVariableAspect - Field name: logger 
16:22:11.656 [[email protected]] INFO RestletResourceVariableAspect - Annotations [] length 0 
16:22:11.656 [[email protected]] INFO RestletResourceVariableAspect - Field name: questionId 
16:22:11.656 [[email protected]] INFO RestletResourceVariableAspect - Annotations [] length 0 
16:22:11.656 [[email protected]] INFO RestletResourceVariableAspect - Field name: ajc$tjp_0 
16:22:11.656 [[email protected]] INFO RestletResourceVariableAspect - Annotations [] length 0 
16:22:11.656 [[email protected]] INFO RestletResourceVariableAspect - Field name: ajc$tjp_1 
16:22:11.656 [[email protected]] INFO RestletResourceVariableAspect - Annotations [] length 0 
16:22:11.656 [[email protected]] INFO QuestionResource - QuestionResource::doGet() 

任何指導我做錯了什麼?我想找到標有註釋的字段,以便我可以根據請求填充它們。

回答

2

請務必添加@Retention(RetentionPolicy.RUNTIME)的註釋定義是這樣的:

@Retention(RetentionPolicy.RUNTIME) 
@Target ({ElementType.FIELD, ElementType.METHOD }) 
@Inherited 
public @interface RestletResourceVariable { 
    String name(); 
} 
+0

你最真棒!謝謝! – 2011-06-18 00:19:12