是否有可能通过使用Guice拦截这样的方法?

时间:2013-01-09 10:06:28

标签: java dependency-injection guice

这是我在这里发表的第一篇文章,大家度过美好的一天:)

我创建了一个名为“Validate”的注释

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Validate {
    Class<? extends MethodInterceptor>[] value();
}

然后在需要拦截的方法之前装饰它。

@Validate({OneInterceptor.class, TwoInterceptor.class})
public void doPost(HttpServletRequest req, HttpServletResponse resp) {
    //Do something
}


OneInterceptor implements MethodInterceptor {.....}  TwoInterceptor implements MethodInterceptor{....}

是否有可能通过使用Guice来绑定这样的拦截器?我只是想Guice动态地在运行时绑定这些拦截器。 谢谢大家!

2 个答案:

答案 0 :(得分:4)

正如mlk所说,你可以编写一个执行此操作的MethodInterceptor,虽然没有理由提到验证器也必须是MethodInterceptors - 事实上,它可能会更容易,因为你没有担心proceed()

如果这段代码没有编译,请原谅我,但它应该指向正确的方向:

public interface RequestValidator {
  void validate(HttpServletRequest req) throws ValidationError;
}

public class ValidationModule extends AbstractModule {
  @Override public void configure() {
    bindInterceptor(Matchers.any(), Matchers.annotatedWith(Validate.class), 
        new ValidateInterceptor());
  }
}

public class ValidateInterceptor implements MethodInterceptor {
  @Override public Object invoke(MethodInvocation invocation) throws Throwable {
    Method method = invocation.getMethod();
    Validate validate = method.getAnnotation(Validate.class);
    if (validate == null) {
      throw new IllegalStateException(
          "ValidateInterceptor installed on non-@Validate method");
    }
    for (Class<? extends RequestValidator> validatorClass : validate.value()) {
      RequestValidator validator = validatorClass.newInstance();
      validator.validate((HttpServletRequest) invocation.getArguments()[0]);
    }
    return invocation.proceed();
  }
}

答案 1 :(得分:0)

你为什么要这样做?为什么不创建两个注释?

我不相信你可以直接做,但你可以写一个MethodInterceptor来执行方法注释中的MethodInterceptor。但是,为什么呢?