0
@InterceptorBinding
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPageReload {
}
public interface Page{
public static final String LOAD_STR = "load";
public void load();
}
@RequestScoped
public class PageImpl1 implements Page{
public void load(){
//...
}
@RequiresPageReload
public String foo(){
//...
return "foo1";
}
}
@RequestScoped
public class MyObject{
@RequiresPageReload
public String foo2(){
//...
return "foo2";
}
}
@RequiresPageReload
@Interceptor
public class RequiresPageReloadInterceptor implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@AroundInvoke
public Object forceReload(InvocationContext context) throws Exception {
Object result = context.proceed();
context.getMethod().getDeclaringClass().getDeclaredMethod(Page.LOAD_STR).invoke(context.getTarget()); //***
return result;
}
}
在標有星號的行中,我當然可以通過反射檢查方法是否存在,並據此決定做什麼。 但我想知道是否有更好的方法來實現相同的行爲? 例如,是否可以將攔截器關聯到特定的類型(在本例中,假設我不希望截斷MyObject的foo2()方法,因爲此類對象不實現Page)?我考慮也使用裝飾,但問題是「富」的方法不屬於一個接口..特定類型的CDI攔截器
謝謝!
嗨!謝謝你的回答..正如我寫的「我也考慮過使用裝飾器,但問題在於」foo的方法不屬於接口..「..我做了不屬於接口的方法的註解,所以裝飾者不會幫助.. :( – Federico 2012-07-25 06:32:57
在CDI中沒有任何東西能夠真正做到這一點,儘管你可以將它作爲擴展名來做。 – LightGuard 2012-07-25 16:20:44