Can the Interceptor change the intercepted method's return value?
jf321023 Feb 22, 2012 1:40 AMHi, guys:
I have a try to do with the Interceptor. I want to intercepte the mothed and do some judgments , then invoke the mothed and change it's return value.
In a practical application , such as a delete button , I want to detemine whether to render it based on the role that the current user has.
My some code follows:
1. the page:
<h:body> <h:form id="myform"> <h:commandButton id="test" value="Test" rendered="#{testAction.test(true)}" /> </h:form> </h:body>
2. the CDI bean
@Model public class TestAction { @Role(roleName={"all","user"}) public boolean test(boolean flag){ return flag; } }
3. the interceptor binding type
@InterceptorBinding @Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface Role { @Nonbinding String[] roleName() default {"all"}; }
4.the interceptor
@Role @Interceptor public class RoleInterceptor { @Inject private UserSession userSession; @AroundInvoke public Object isUserHasRole(InvocationContext ctx){ try{ System.out.println(FacesContext.getCurrentInstance().getCurrentPhaseId().toString()); String[] roleNames = ctx.getMethod().getAnnotation(Role.class).roleName(); System.out.println(roleNames[0]+roleNames[1]); System.out.println(userSession.getUsername()); // TODO: do some judgments ctx.getMethod().invoke(ctx.getTarget(), new Object[]{false}); Object o = ctx.proceed(); return o; }catch (Exception e) { // TODO: handle exception } return null; } }
5. enable the interceptor in the beans.xml
<interceptors> <class>org.jboss.viewconfig.RoleInterceptor</class> </interceptors>
Now, the are two problem . First, the Interceptor method will be invoked six times and all the times in the RenderResponse phase. I don't know why it be invoked six times in my code.
Second, after the interceptor method return , the intercepted method will invoke one time. so now i can't change the inercepthed method's return value with the Interceptor . Can it be possable? and how should i do?