2013-07-01 30 views
1

我在寻找如何在Play Framework 2中实现过滤器,并且据我所知,最好的方法是使用动作组合来实现。Java + 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%我需要执行完整的域验证。

KR, 艾伦

回答

0

我可以看到这个工作的唯一方法是改变注释,这样你就可以提供(在类级别)的方法的可选列表忽略或者被语法只验证(以适合您的应用为准)。

事实上,有两个不同的注释可能会更好,一个在课堂级别,另一个在方法级别。

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

相关问题