<div><meta charset="utf-8"><span class="Apple-style-span" style="font-family: Helvetica; font-size: 12px; ">The specification has an example in 9.5.1 that returns a void. AspectJ/AspectWerks annotation allow this (prior art).</span></div>
<div><span class="Apple-style-span" style="font-family: Helvetica; font-size: 12px; "><br></span></div><div><font class="Apple-style-span" face="Helvetica"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div>
Can interceptors return void? The specification seem unclear on this. Well, it shows an example but there is no further verbiage.<div><br><div><br></div><div><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<title></title>
<meta name="Generator" content="Cocoa HTML Writer">
<meta name="CocoaVersion" content="1038.35">
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px}
p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #5574c7}
p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #777777}
p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #4f9073}
p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #ff1b18}
span.s1 {color: #921167}
span.s2 {color: #92afc9}
span.s3 {text-decoration: underline}
span.s4 {color: #000000}
span.s5 {color: #777777}
span.s6 {color: #211cc7}
span.s7 {color: #4726f9}
span.s8 {color: #4f9073}
span.s9 {text-decoration: underline ; color: #14118f}
span.Apple-tab-span {white-space:pre}
</style>


<p class="p1">I get three different behaviors for this interceptor:</p>
<p class="p2"><br></p>
<p class="p3"><span class="s1">package</span> org.cdi.advocacy.security;</p>
<p class="p4"><br></p>
<p class="p4"><br></p>
<p class="p4"><br></p>
<p class="p3"><span class="s1">import</span> javax.inject.Inject;</p>
<p class="p3"><span class="s1">import</span> javax.interceptor.AroundInvoke;</p>
<p class="p3"><span class="s1">import</span> javax.interceptor.Interceptor;</p>
<p class="p3"><span class="s1">import</span> javax.interceptor.InvocationContext;</p>
<p class="p4"><br></p>
<p class="p5">/**</p>
<p class="p5"> * <span class="s2">@author</span> <span class="s3">Richard</span> <span class="s3">Hightower</span></p>
<p class="p5"> */</p>
<p class="p6">@Secure<span class="s4"> </span>@Interceptor</p>
<p class="p3"><span class="s1">public</span> <span class="s1">class</span> SecurityAdvice {</p>
<p class="p3">        </p>
<p class="p3">        <span class="s5">@Inject</span></p>
<p class="p3">        <span class="s1">private</span> SecurityService <span class="s6">securityManager</span>;</p>
<p class="p4"><br></p>
<p class="p6"><span class="s4">        </span>@AroundInvoke</p>
<p class="p3">        <span class="s1">public</span> <span class="s1">void</span> checkSecurity(InvocationContext joinPoint) <span class="s1">throws</span> Exception {</p>
<p class="p3">        <span class="Apple-tab-span">        </span></p>
<p class="p3">        <span class="Apple-tab-span">        </span>System.<span class="s6">out</span>.println(<span class="s7">&quot;In SecurityAdvice&quot;</span>);</p>
<p class="p3">                </p>
<p class="p7"><span class="s4">            </span>/* If the user is not logged in, don&#39;t let them use this method */</p>
<p class="p3">            <span class="s1">if</span>(!<span class="s6">securityManager</span>.isLoggedIn()){            </p>
<p class="p3">                <span class="s1">throw</span> <span class="s1">new</span> SecurityViolationException();</p>
<p class="p3">            }</p>
<p class="p4"><br></p>
<p class="p7"><span class="s4">            </span>/* Get the name of the method being invoked. */</p>
<p class="p3">            String operationName = joinPoint.getMethod().getName();</p>
<p class="p7"><span class="s4">            </span>/* Get the name of the object being invoked. */</p>
<p class="p3">            String objectName = joinPoint.getTarget().getClass().getName();</p>
<p class="p4"><br></p>
<p class="p4"><br></p>
<p class="p3">           <span class="s8">/*</span></p>
<p class="p7">            * Invoke the method or next <span class="s3">Interceptor</span> in the list,</p>
<p class="p7">            * if the current user is allowed.</p>
<p class="p7">            */</p>
<p class="p3">            <span class="s1">if</span> (!<span class="s6">securityManager</span>.isAllowed(objectName, operationName)){</p>
<p class="p3">                <span class="s1">throw</span> <span class="s1">new</span> SecurityViolationException();</p>
<p class="p3">            }</p>
<p class="p3">        </p>
<p class="p3">            joinPoint.proceed();</p>
<p class="p3">        }</p>
<p class="p3">}</p>
<p class="p4"><br></p>
<p class="p3">Weld does not recognize it because it returns void. It fails silently.</p>
<p class="p3">Candi recognizes it and uses it.</p>
<p class="p3">OpenWebBeans throws an exception as follows:</p>
<p class="p4"><br></p>
<p class="p4"><br></p>
<p class="p4"><br></p>
<p class="p8"><span class="s9">org.apache.webbeans.exception.WebBeansConfigurationException</span>: @AroundInvoke annotated method : checkSecurity in class : org.cdi.advocacy.security.SecurityAdvice must return Object type</p>

<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.util.WebBeansUtil.checkAroundInvokeAnnotationCriterias(<span class="s9">WebBeansUtil.java:1094</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.util.WebBeansUtil.configureInterceptorMethods(<span class="s9">WebBeansUtil.java:1241</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.intercept.WebBeansInterceptorConfig.addMethodInterceptors(<span class="s9">WebBeansInterceptorConfig.java:349</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.intercept.WebBeansInterceptorConfig.configure(<span class="s9">WebBeansInterceptorConfig.java:250</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.config.DefinitionUtil.defineBeanInterceptorStack(<span class="s9">DefinitionUtil.java:1058</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.config.BeansDeployer.validate(<span class="s9">BeansDeployer.java:365</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.config.BeansDeployer.validateInjectionPoints(<span class="s9">BeansDeployer.java:326</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.config.BeansDeployer.deploy(<span class="s9">BeansDeployer.java:179</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.lifecycle.AbstractLifeCycle.startApplication(<span class="s9">AbstractLifeCycle.java:123</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.cdiadvocate.beancontainer.OpenWebBeansBeanContainer.doStart(<span class="s9">OpenWebBeansBeanContainer.java:26</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.cdiadvocate.beancontainer.AbstractBeanContainer.start(<span class="s9">AbstractBeanContainer.java:111</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.cdi.advocacy.AtmMain.&lt;clinit&gt;(<span class="s9">AtmMain.java:25</span>)</p>
<p class="p8">Exception in thread &quot;main&quot; java.lang.ExceptionInInitializerError</p>
<p class="p8">Caused by: <span class="s9">org.cdiadvocate.beancontainer.BeanContainerInitializationException</span>: Unable to start BeanContainer : @AroundInvoke annotated method : checkSecurity in class : org.cdi.advocacy.security.SecurityAdvice must return Object type</p>

<p class="p8"><span class="Apple-tab-span">        </span>at org.cdiadvocate.beancontainer.AbstractBeanContainer.start(<span class="s9">AbstractBeanContainer.java:113</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.cdi.advocacy.AtmMain.&lt;clinit&gt;(<span class="s9">AtmMain.java:25</span>)</p>
<p class="p8">Caused by: <span class="s9">org.apache.webbeans.exception.WebBeansConfigurationException</span>: @AroundInvoke annotated method : checkSecurity in class : org.cdi.advocacy.security.SecurityAdvice must return Object type</p>

<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.util.WebBeansUtil.checkAroundInvokeAnnotationCriterias(<span class="s9">WebBeansUtil.java:1094</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.util.WebBeansUtil.configureInterceptorMethods(<span class="s9">WebBeansUtil.java:1241</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.intercept.WebBeansInterceptorConfig.addMethodInterceptors(<span class="s9">WebBeansInterceptorConfig.java:349</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.intercept.WebBeansInterceptorConfig.configure(<span class="s9">WebBeansInterceptorConfig.java:250</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.config.DefinitionUtil.defineBeanInterceptorStack(<span class="s9">DefinitionUtil.java:1058</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.config.BeansDeployer.validate(<span class="s9">BeansDeployer.java:365</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.config.BeansDeployer.validateInjectionPoints(<span class="s9">BeansDeployer.java:326</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.config.BeansDeployer.deploy(<span class="s9">BeansDeployer.java:179</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.apache.webbeans.lifecycle.AbstractLifeCycle.startApplication(<span class="s9">AbstractLifeCycle.java:123</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.cdiadvocate.beancontainer.OpenWebBeansBeanContainer.doStart(<span class="s9">OpenWebBeansBeanContainer.java:26</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>at org.cdiadvocate.beancontainer.AbstractBeanContainer.start(<span class="s9">AbstractBeanContainer.java:111</span>)</p>
<p class="p8"><span class="Apple-tab-span">        </span>... 1 more</p>
<p class="p2"><br></p>
<p class="p1">I think CDI 1.1 should clarify the behavior and I think it should support return types of void.</p>-- <br><b>Rick Hightower</b><br>(415) 968-9037 <br><a href="http://www.google.com/profiles/RichardHightower" target="_blank">Profile</a> <br>
<br>
</div></div>