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% 完全なドメイン検証を実行する必要があります。
クル、アラン