我一直在寻找如何在 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% 我需要执行完整的域验证。
克鲁,艾伦