1

これはここでの私の最初の投稿です、皆さん良い一日をお過ごしください:)

「検証」という名前の注釈を作成しました

@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がランタイムでこれらのインターセプターを動的にバインドしたいだけです。みんなありがとう!

4

2 に答える 2

3

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();
  }
}
于 2013-01-09T22:29:48.173 に答える
0

なぜあなたはそれをこのようにしたいのですか?2つの注釈を作成してみませんか?

直接できるとは思いませんが、メソッドアノテーションでsMethodInterceptorを実行するを書くことはできます。MethodInterceptorしかし、繰り返しますが、なぜですか?

于 2013-01-09T12:35:08.333 に答える