0

我正在使用反射在类中查找方法并获取描述方法实现的操作类型(CREATE、DELETE、...)的注释“PermessiNecessari”。

这是一个实现一个纠察链接类PathAuthorizer的授权检查。我得到一个调用的 url,我将其拆分,然后从 url 中找到实现 Web 服务的类。然后我搜索它将被调用的方法并读取它使用的操作类型。

这是 search-method 的一部分:

Class facadeinterface = Class.forName(pm); // get the interface
Method metodo = getMetodoClasse(facadeinterface, metodoRest); // find method with @Path annotation
if(metodo != null){
   PermessiNecessari rp = metodo.getAnnotation(PermessiNecessari.class);

   if(rp != null){ // caso metodo con permessi
       return checkPermessiModulo(m, rp);
   }

   if(metodo.isAnnotationPresent(NonProtetto.class)){ 
       return true;
   }
   LOG.log(Level.WARNING, "Metodo trovato : {0}/{1}, ma non annotato!", new Object[]{metodoRest,metodo});

例如,这是检查类:

public interface VlpgmoduliManagerFacadeRemote 
   extends InterfacciaFacadeRemote<Vlpgmoduli>{

  @POST 
  @javax.ws.rs.Path("getpermessimoduligruppo")
  @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
  @Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
  @PermessiNecessari(operation = STANDARD_OP.READ)
  public GridResponse<Vlpgmoduli> getPermessiModuliGruppo(MultivaluedMap<String, String> formParams, 
        String callback) 
        throws BadRequestException;
...

该方法是通过@javax.ws.rs.Path 注解找到的,但是当我想获得“PermessiNecessari”注解时,找不到这个注解!

PS:在其他课程中,该系统运行良好。父接口中的方法也没有找到!尝试使用扩展相同接口的另一个接口,并找到所有方法(也继承了)。

这是我的注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PermessiNecessari {    
    Class resourceClass() default void.class;
    String operation() default "";
    String modulo() default "";
}

这是搜索实现 Web 服务的方法的方法:

private Method getMetodoClasse(Class facade, String metodo){
    for(Method method : facade.getMethods()){
        Path p = method.getAnnotation(Path.class);
        if(p != null && ( p.value().equals(metodo) || p.value().equals("/"+metodo) )){
            return method;
        }
    }
    for (Class c : facade.getInterfaces()) {
        for (Method method : c.getDeclaredMethods()) {
            Path p = method.getAnnotation(Path.class);
            if(p != null && ( p.value().equals(metodo) || p.value().equals("/"+metodo) )){
                return method;
            }
        }
    }
    return null;
}

编辑:这不是注释问题。我试过这个检查:

public boolean haAnnotazione(Method method, Class annotationType){
    Annotation annotazioni[] = method.getAnnotations();
    for(Annotation a : annotazioni){
      if(a.annotationType().getName().equals(annotationType.getName())){
            return true;
        }
    }
    return false;
}

如果我使用a.annotationType().equals(annotationType)它返回 false 即使它们是相同的;如果我使用班级的名称,它可以工作!

也许是类加载器问题?该软件在 Wildfly 中运行。

4

2 回答 2

1

解决了!

这是一个依赖错误。项目中有两个不同的依赖版本,所以加载的注解实际上是两个不同的类。

下一次:如果您有一些强制转换异常或两个相等的类不相等,请检查您的 pom.xml 中的不同依赖项。

...真的没有解决,EAR/lib 和 WAR/lib 中的类之间存在类加载器问题,但这是另一个问题

于 2016-11-09T17:10:00.480 回答
0

@PermessiNecessari必须是运行时保留,因为如果保留不同,编译器会将有关该注释的不包含信息删除到字节码中。

这就是为什么在运行时找不到您的注释 - 它不存在。

于 2016-11-09T12:42:22.393 回答