簡體   English   中英

如何使用局部變量注釋進行Wicket授權?

[英]How do I use Local Variable Annotations for Wicket Authorization?

我正在為Wicket 1.5.x滾動我自己的IAuthorizationStrategy ,我為與isInstantiationAuthorized()一起使用的頁面設置了類型注釋。 它運作良好,我也想對isActionAuthorized()使用注釋。 理想情況下,我希望能夠注釋局部變量,然后在我的AuthStrategy中檢查注釋。 從我讀過的內容來看,局部變量注釋不能那樣工作。

是否有任何已知的解決方法,也許是某種編譯時注釋處理,以將帶注釋的局部變量轉換為以該注釋作為類型注釋的“匿名”子類?

作為記錄,我嘗試使用的注釋如下所示:

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

UPDATE

因此,基於@XaviLópez的答案,我希望做的事情並非完全可行。 不過,帶注釋的LocalVariables 應該在編譯時可用。 有什么辦法可以將它們用作簡化鍍覆Wicket示例或出色的Apache Wicket Cookbook中可用的元數據代碼示例的快捷方式嗎?

一段時間以前,我在Wicket 1.3.x上也遇到過類似的問題,並且找不到任何方法可以通過注釋來實現。 如JLS( 9.6.3.2。@Retention )中所述,無法在運行時保留局部變量的注釋:

本地變量聲明的注釋永遠不會保留在二進制表示中。

在這個相關的問題中: 如何創建處理局部變量的注釋處理器? 他們談論了LAPT-javac ,這是一個修補的javac版本,允許這樣做。 在他們的網站上,有一個指向類型注釋規范(JSR 308)的鏈接 ,希望可以解決這個問題( JDK 8 ?)。

我最終用一個相關的功能代碼定義了一個簡單的舊界面:

public interface RestrictedComponent {
    Integer getFunction();
}

這種方法的主要問題在於,不可能使特定類的即時匿名子類實現其他接口(例如Component c = new TextField() implements AdminOnly { } ),但是您始終可以定義僅實現RestrictedComponent Component擴展。在課堂上:

public abstract class RestrictedTextField extends TextField implements RestrictedComponent { } 

最后,我最終實現了一個RestrictedContainer ,該子類只是WebMarkupContainer子類,並將每個受保護的組件放入一個組件中,並在標記中使用<wicket:container>對其進行建模。

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;
    }
}

然后在“授權策略”中檢查component instanceof RestrictedComponent並根據相關功能的用戶權限返回truefalse

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM