-
Clarification
-
Resolution: Won't Do
-
Minor
-
None
-
None
-
None
The specification has an example in 9.5.1 that returns a void. AspectJ/AspectWerks annotation allow this (prior art).
Can interceptors return void? The specification seem unclear on this. Well, it shows an example but there is no further verbiage.
I get three different behaviors for this interceptor:
package org.cdi.advocacy.security; import javax.inject.Inject; import javax.interceptor.AroundInvoke; import javax.interceptor.Interceptor; import javax.interceptor.InvocationContext; /** * @author Richard Hightower */ @Secure @Interceptor public class SecurityAdvice { @Inject private SecurityService securityManager; @AroundInvoke public void checkSecurity(InvocationContext joinPoint) throws Exception { System.out.println("In SecurityAdvice"); /* If the user is not logged in, don't let them use this method */ if(!securityManager.isLoggedIn()){ throw new SecurityViolationException(); } /* Get the name of the method being invoked. */ String operationName = joinPoint.getMethod().getName(); /* Get the name of the object being invoked. */ String objectName = joinPoint.getTarget().getClass().getName(); /* * Invoke the method or next Interceptor in the list, * if the current user is allowed. */ if (!securityManager.isAllowed(objectName, operationName)){ throw new SecurityViolationException(); } joinPoint.proceed(); } }
Weld does not recognize it because it returns void. It fails silently.
Candi recognizes it and uses it.
OpenWebBeans throws an exception as follows:
org.apache.webbeans.exception.WebBeansConfigurationException: @AroundInvoke annotated method : checkSecurity in class : org.cdi.advocacy.security.SecurityAdvice must return Object type at org.apache.webbeans.util.WebBeansUtil.checkAroundInvokeAnnotationCriterias(WebBeansUtil.java:1094) at org.apache.webbeans.util.WebBeansUtil.configureInterceptorMethods(WebBeansUtil.java:1241) at org.apache.webbeans.intercept.WebBeansInterceptorConfig.addMethodInterceptors(WebBeansInterceptorConfig.java:349) at org.apache.webbeans.intercept.WebBeansInterceptorConfig.configure(WebBeansInterceptorConfig.java:250) at org.apache.webbeans.config.DefinitionUtil.defineBeanInterceptorStack(DefinitionUtil.java:1058) at org.apache.webbeans.config.BeansDeployer.validate(BeansDeployer.java:365) at org.apache.webbeans.config.BeansDeployer.validateInjectionPoints(BeansDeployer.java:326) at org.apache.webbeans.config.BeansDeployer.deploy(BeansDeployer.java:179) at org.apache.webbeans.lifecycle.AbstractLifeCycle.startApplication(AbstractLifeCycle.java:123) at org.cdiadvocate.beancontainer.OpenWebBeansBeanContainer.doStart(OpenWebBeansBeanContainer.java:26) at org.cdiadvocate.beancontainer.AbstractBeanContainer.start(AbstractBeanContainer.java:111) at org.cdi.advocacy.AtmMain.<clinit>(AtmMain.java:25) Exception in thread "main" java.lang.ExceptionInInitializerError Caused by: org.cdiadvocate.beancontainer.BeanContainerInitializationException: Unable to start BeanContainer : @AroundInvoke annotated method : checkSecurity in class : org.cdi.advocacy.security.SecurityAdvice must return Object type at org.cdiadvocate.beancontainer.AbstractBeanContainer.start(AbstractBeanContainer.java:113) at org.cdi.advocacy.AtmMain.<clinit>(AtmMain.java:25) Caused by: org.apache.webbeans.exception.WebBeansConfigurationException: @AroundInvoke annotated method : checkSecurity in class : org.cdi.advocacy.security.SecurityAdvice must return Object type at org.apache.webbeans.util.WebBeansUtil.checkAroundInvokeAnnotationCriterias(WebBeansUtil.java:1094) at org.apache.webbeans.util.WebBeansUtil.configureInterceptorMethods(WebBeansUtil.java:1241) at org.apache.webbeans.intercept.WebBeansInterceptorConfig.addMethodInterceptors(WebBeansInterceptorConfig.java:349) at org.apache.webbeans.intercept.WebBeansInterceptorConfig.configure(WebBeansInterceptorConfig.java:250) at org.apache.webbeans.config.DefinitionUtil.defineBeanInterceptorStack(DefinitionUtil.java:1058) at org.apache.webbeans.config.BeansDeployer.validate(BeansDeployer.java:365) at org.apache.webbeans.config.BeansDeployer.validateInjectionPoints(BeansDeployer.java:326) at org.apache.webbeans.config.BeansDeployer.deploy(BeansDeployer.java:179) at org.apache.webbeans.lifecycle.AbstractLifeCycle.startApplication(AbstractLifeCycle.java:123) at org.cdiadvocate.beancontainer.OpenWebBeansBeanContainer.doStart(OpenWebBeansBeanContainer.java:26) at org.cdiadvocate.beancontainer.AbstractBeanContainer.start(AbstractBeanContainer.java:111) ... 1 more