2

私はIAuthorizationStrategyWicket 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の回答に基づいて、私が望んでいたことは正確には不可能です。ただし、注釈付きの LocalVariablesはコンパイル時に利用できるはずです。Wicket Examplesまたは優れた Apache Wicket Cookbook で利用可能なメタデータ コード例をボイラー プレート化するためのショートカットとしてそれらを使用できる方法はありますか?

4

1 に答える 1

0

しばらく前にWicket1.3.xで同様の問題に苦労しましたが、注釈を使用してこれを実現する方法が見つかりませんでした。JLS( 9.6.3.2。@Retention)で説明されているように、ローカル変数の注釈は実行時に保持できません。

ローカル変数宣言の注釈がバイナリ表現に保持されることはありません。

この関連する質問:ローカル変数を処理する注釈プロセッサを作成するにはどうすればよいですか?彼らは、これを可能にするパッチを適用したバージョンであるLAPT-javacについて話しました。彼らのサイトには、 Type Annotations Specification(JSR 308)javacへのリンクがあります。これは、この主題( JDK 8?)に対応することを願っています。

私は、関連する機能コードを使用して、単純な古いインターフェイスを定義することになりました。

public interface RestrictedComponent {
    Integer getFunction();
}

このアプローチの主な問題は、特定のクラスのインスタント匿名サブクラスに他のインターフェイス(など)を実装させることができないことですが、クラスに実装するだけの拡張機能をComponent c = new TextField() implements AdminOnly { }いつでも定義できます。ComponentRestrictedComponent

public abstract class RestrictedTextField extends TextField implements RestrictedComponent { } 

最後に、RestrictedContainerサブクラスWebMarkupContainer化されたすべての保護されたコンポーネントを1つの内部に配置<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て返さtrueれるかfalse、関連する機能のユーザー権限に依存します。

于 2012-12-14T11:30:39.110 に答える