2013-01-09 44 views
1

這是我在這裏的第一篇文章,有一個愉快的一天大家:)有沒有可能通過使用Guice來攔截這樣的方法?

我創建了一個名爲「驗證」的註釋

@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動態地在運行時綁定這些攔截器。 謝謝大家!

+1

你讀過這一點:http://code.google.com/p/google- guice/wiki/AOP – RJo

回答

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 [email protected] method"); 
    } 
    for (Class<? extends RequestValidator> validatorClass : validate.value()) { 
     RequestValidator validator = validatorClass.newInstance(); 
     validator.validate((HttpServletRequest) invocation.getArguments()[0]); 
    } 
    return invocation.proceed(); 
    } 
} 
+0

非常感謝傑夫,它按預期工作!對不起,我沒有15的聲望,因爲這是我在這裏的第一篇文章,所以我不能爲你投票回答。非常感激。 – Michael

+0

@ user1960799很高興幫助!如果我的回答是最有幫助的,請使用[箭頭下方的複選框](http://stackoverflow.com/faq#howtoask)將我的標記標記爲「已接受的答案」。它比upvote更棒。謝謝,歡迎來到Stack Overflow! –

+0

完成了。乾杯。 – Michael

0

你爲什麼要這樣做?爲什麼不創建兩個註釋?

我不相信你可以直接做,但是你可以寫一個MethodInterceptor在方法註釋中執行MethodInterceptor。但是,爲什麼呢?

+0

嗨mlk,謝謝你的回答。是的,我通過在過去定義單獨的註釋來做到這一點。但是我發現我必須定義太多的註釋。對於這種情況,我必須定義4,因爲有些方法只使用一個攔截器,但有些使用不同的順序。 1. OneInterceptor.class 2. TwoInterceptor.class 3. {OneInterceptor.class,TwoInterceptor.class} 4. {TwoInterceptor.class,OneInterceptor.class} – Michael