2

我正在IAuthorizationStrategy为 Wicket 1.5.x 滚动我自己我已经为页面设置了类型注释以与isInstantiationAuthorized(). 它运作良好,我也想使用注释isActionAuthorized()。理想情况下,我希望能够注释局部变量,然后检查我的 AuthStrategy 中的注释。从我读过的内容来看,局部变量注释不是这样工作的。

是否有任何已知的解决方法,也许是某种编译时注释处理以将带注释的局部变量转换为“匿名”子类,并将注释作为类型注释?

作为记录,我尝试使用的注释如下所示:

@Retention(RetentionPolicy.Runtime)
@Target(ElementType.Type, ElementType.LOCAL_VARIABLE)
public @interface AdminOnly
{
  int isVisible() default 0;
  int isEnabled() default 1;
}

更新

因此,基于@Xavi López'es 的回答,我希望做的事情并不完全可能。不过,带注释的 LocalVariables应该在编译时可用。有什么方法可以让我使用它们作为对Wicket 示例或优秀的 Apache Wicket Cookbook 中可用的元数据代码示例进行样板化的捷径?

4

1 回答 1

0

前段时间,我在 Wicket 1.3.x 上遇到过类似的问题,但没有找到任何方法通过注释来实现这一点。正如 JLS ( 9.6.3.2. @Retention )中所解释的那样,在运行时不能保留对局部变量的注释:

局部变量声明上的注释永远不会保留在二进制表示中。

在这个相关问题中:如何创建处理局部变量的注释处理器?他们谈到了LAPT-javacjavac ,这是一个允许这样做的补丁版本。在他们的网站上有一个指向Type Annotations Specification (JSR 308)的链接,它有望解决这个主题(JDK 8?)。

我最终定义了一个带有相关功能代码的普通旧接口:

public interface RestrictedComponent {
    Integer getFunction();
}

这种方法的主要问题是不可能使特定类的即时匿名子类实现其他接口(例如Component c = new TextField() implements AdminOnly { }),但您始终可以定义仅在类Component中实现的扩展:RestrictedComponent

public abstract class RestrictedTextField extends TextField implements RestrictedComponent { } 

最后,我最终实现了一个RestrictedContainer子类化WebMarkupContainer并将每个安全组件放入其中,并<wicket:container>在标记中使用 a 对其进行建模。

public class RestrictedContainer extends WebMarkupContainer implements RestrictedComponent {
    private final Integer function;
    public RestrictedContainer(String id, IModel model, final Integer function) {
        super(id, model);
        this.function = function;
    }
    public RestrictedContainer(String id, final Integer funcionalitat) {
        super(id);
        this.function = function;
    }
    public Integer getFunction() {
        return function;
    }
}

然后在 Authorization Strategy 中检查component instanceof RestrictedComponent并返回truefalse取决于用户对相关功能的权限。

于 2012-12-14T11:30:39.110 回答