1

我一直在寻找如何在 Play Framework 2 中实现过滤器,据我所知,最好的方法是使用动作组合来实现它。

也就是说,我开始做一些测试,并且能够让它发挥作用。唯一的限制是当我在同一个类中嵌套注释时。

我当前的用例

当请求中存在域参数时执行域验证。
如果本地数据库中不存在该域,则仅执行语法验证。否则,需要完全验证(这里什么是完全验证并不重要)。

我当前使用动作组合的代码

控制器有两个注解:

  • 一种适用于大多数需要完整域验证的情况。
  • 另一个专门针对 addCustomer 的注释,我只想在其中执行语法验证。

但是有两个“问题”。我期望 DomainVerifierFiler 操作仅使用增强属性(syntaxVerificationOnly)调用一次。这是发生的事情:

  • addCustomer 调用了两次“过滤器”;
  • 第一个被调用的是方法注解(类注解总是覆盖方法);
 @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
            }
        }
 }

问题:有什么解决办法吗?我在这里做错了吗?有什么建议么?

当前的解决方法是我正在检查它是否是对同一操作的第二次调用。如果是,我不检查就继续。但这显然是不希望的。

另一种可能性是在每个方法中添加注释。这也是不希望的,因为我有很多以域为参数的方法。而且,99.99% 我需要执行完整的域验证。

克鲁,艾伦

4

1 回答 1

0

我可以看到这项工作的唯一方法是更改​​注释,因此您可以(在类级别)提供一个可选的方法列表以忽略或仅通过语法验证(以更适合您的应用程序为准)。

事实上,最好有 2 个不同的注解,一个在类级别,一个在方法级别。

否则,恐怕它总是会调用注解两次,因为它在代码中存在两次。

于 2013-07-02T09:40:23.713 回答