我正在使用反射在类中查找方法并获取描述方法实现的操作类型(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 中运行。