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

Java 有没有可能通过使用Guice拦截这样的方法?,java,dependency-injection,guice,Java,Dependency Injection,Guice,这是我在这里的第一篇帖子,祝大家度过愉快的一天:) 我创建了一个名为“验证”的注释 有没有可能通过使用Guice绑定这样的拦截器?我只想让Guice在运行时动态绑定这些拦截器。 谢谢大家 你为什么要这样做?为什么不创建两个注释 我不相信您可以直接这样做,但是您可以编写一个MethodInterceptor,在methods注释中执行MethodInterceptors。但是,为什么呢 正如mlk所指出的,您可以编写一个MethodInterceptor来实现这一点,尽管没有理由说上面提到的验证器

这是我在这里的第一篇帖子,祝大家度过愉快的一天:)

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

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

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


我不相信您可以直接这样做,但是您可以编写一个
MethodInterceptor
,在methods注释中执行
MethodInterceptor
s。但是,为什么呢

正如mlk所指出的,您可以编写一个MethodInterceptor来实现这一点,尽管没有理由说上面提到的验证器也必须是MethodInterceptor——事实上,这样做可能会更容易,因为您不必担心
继续()

如果此代码未编译,请原谅,但它应该为您指出正确的方向:

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();
  }
}
公共接口请求验证程序{
void validate(HttpServletRequest req)抛出ValidationError;
}
公共类ValidationModule扩展了AbstractModule{
@重写公共void configure(){
bindInterceptor(Matchers.any()、Matchers.annotatedWith(Validate.class)),
新的ValidateInterceptor());
}
}
公共类ValidateInterceptor实现MethodInterceptor{
@重写公共对象调用(MethodInvocation调用)抛出可丢弃{
Method=invocation.getMethod();
Validate=method.getAnnotation(Validate.class);
if(validate==null){
抛出新的非法状态异常(
“安装在非@Validate方法上的ValidateInterceptor”);
}

对于(类)你读过这个吗:嗨,mlk,谢谢你的回答。是的,我以前是通过定义单独的注释来实现的。但是我发现我必须定义太多的注释。对于这种情况,我必须定义4,因为有些方法只使用一个拦截器,但有些方法使用两个拦截器的顺序不同。1.OneInterceptor.class 2.TwoInterceptor.class 3。{OneInterceptor.class,TwoInterceptor.class}4.{TwoInterceptor.class,OneInterceptor.class}非常感谢Jeff,它按预期工作!很抱歉,我没有15个声誉,因为这是我在这里的第一篇帖子,所以我无法投票支持你的答案。非常感谢。@user1960799很高兴提供帮助!如果我的答案是最有帮助的,请使用将我的答案标记为“已接受的答案”。它甚至比upvote更好。谢谢,欢迎使用堆栈溢出!如果您能设法使用injector.getInstance(validatorClass)而不是validatorClass.newInstance(),您甚至可以在验证器中使用DI。。。
@Validate({OneInterceptor.class, TwoInterceptor.class})
public void doPost(HttpServletRequest req, HttpServletResponse resp) {
    //Do something
}


OneInterceptor implements MethodInterceptor {.....}  TwoInterceptor implements MethodInterceptor{....}
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();
  }
}