1

Play Framework 2 でフィルターを実装する方法を探していましたが、私の知る限りでは、アクション合成を使用して実装するのが最善の方法です。

そうは言っても、私はいくつかのテストを開始し、それを機能させることができました. 唯一の制限は、同じクラスにネストされた注釈がある場合です。

私の現在の使用例

domain パラメーターがリクエストに存在する場合、ドメイン検証を実行します。
ドメインがローカル データベースに存在しない場合は、構文の検証のみを実行します。それ以外の場合は、完全な検証が必要です (完全な検証とは何かはここでは重要ではありません)。

アクション構成を使用した現在のコード

コントローラーには 2 つの注釈があります。

  • 完全なドメイン検証が必要なほとんどの場合に 1 つ。
  • 構文検証のみを実行したい addCustomer 専用の別の注釈。

ただし、2つの「問題」があります。拡張プロパティ (syntaxVerificationOnly) を使用して、DomainVerifierFiler アクションが 1 回だけ呼び出されることを期待していました。何が起こるかは次のとおりです。

  • 「フィルター」は、addCustomer に対して 2 回呼び出されています。
  • 最初に呼び出されるのはメソッド アノテーションです (クラス アノテーションは常にメソッドをオーバーライドします)。
 @DomainVerificationFilter
 public class CustomerController {

      public Result updateCustomer(String domain) {}

      public Result deleteCustomer(String domain) {}

      @DomainVerificationFilter(syntaxVerificationOnly = true)
      public Result addCustomer(String domain) {}
 }
 @With(DomainVerifierAction.class)
 @Target({ElementType.TYPE, ElementType.METHOD})
 @Retention(RetentionPolicy.RUNTIME)
 public @interface DomainVerifierFilter {
    boolean syntaxVerificationOnly() default false;
 }
 public class DomainVerifierAction extends Action<DomainVerifierFilter> {
        @Override
        public Result call(Http.Context ctx) throws Throwable {
           if (configuration.syntaxVerificationOnly()) {
                //sintax verification
            } else {
                //full verification
            }
        }
 }

質問:これに対する修正はありますか? ここで間違ったアプローチをしていますか?助言がありますか?

現在の回避策は、同じアクションへの 2 回目の呼び出しかどうかを確認することです。はいの場合は、チェックせずに先に進みます。しかし、これは明らかに望ましくありません。

別の可能性は、すべてのメソッドに注釈を追加することです。ドメインをパラメーターとして使用するメソッドがたくさんあるため、これも望ましくありません。そして、99.99% 完全なドメイン検証を実行する必要があります。

クル、アラン

4

1 に答える 1