<html><head><style type='text/css'>p { margin: 0; }</style></head><body><div style='font-family: Arial; font-size: 10pt; color: #000000'>Weld will issue a warning when processing interceptors, indicating that the method does not meet the criteria for being considered an interceptor method.<br><br>The plan is to actually throw a deployment exception in the future (there's a WELD issue for that). One of the problems of the interceptors specification is that it does not indicate when the container should throw a deployment error (in the same way as for example the CDI specification does), it just says what should be considered an interceptor method. So it's basically an issue of deciding for yourself whether you want to be "lenient and confusing" vs "unforgiving".<br><br><hr id="zwchr"><div style="color: rgb(0, 0, 0); font-weight: normal; font-style: normal; text-decoration: none; font-family: Helvetica,Arial,sans-serif; font-size: 12pt;"><b>From: </b>"Jaikiran Pai" &lt;jpai@redhat.com&gt;<br><b>To: </b>cdi-dev@lists.jboss.org<br><b>Sent: </b>Monday, May 16, 2011 2:58:50 AM<br><b>Subject: </b>Re: [cdi-dev] interceptor that return void, unclear in 1.0 specification, needs clarification in 1.1<br><br>

  
    
    <title></title>
  
    <tt>The interceptors spec says this about @AroundInvoke methods on
      interceptors:<br>
      <br>
      &lt;quote&gt;<br>
      Around-invoke methods have the following signature:<br>
      <br>
      Object &lt;METHOD&gt;(InvocationContext) throws Exception<br>
      <br>
      &lt;/quote&gt;<br>
      <br>
      By the way, if Weld is failing silently, then I guess it needs to
      be improved to throw an explicit error.<br>
      <br>
      -Jaikiran<br>
      On Monday 16 May 2011 12:06 PM, Rick Hightower wrote:</tt>
    <blockquote cite="mid:BANLkTi=KUyRxFn8mxGgjTQFjO0s3vYR52w@mail.gmail.com">
      <div>
        
        <tt><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></tt></div>
      <div><tt><span class="Apple-style-span" style="font-family: Helvetica; font-size: 12px;"><br>
          </span></tt></div>
      <div><tt><font class="Apple-style-span"><span class="Apple-style-span" style="font-size: 12px;"><br>
            </span></font></tt></div>
      <tt>
        Can interceptors return void? The specification seem unclear on
        this. Well, it shows an example but there is no further
        verbiage.</tt>
      <div><tt><br>
        </tt>
        <div><tt><br>
          </tt></div>
        <div>
          
          
          <title></title>
          
          
          <style>
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"><tt>I get three different behaviors for this
              interceptor:</tt></p>
          <p class="p2"><tt><br>
            </tt></p>
          <p class="p3"><tt><span class="s1">package</span>
              org.cdi.advocacy.security;</tt></p>
          <p class="p4"><tt><br>
            </tt></p>
          <p class="p4"><tt><br>
            </tt></p>
          <p class="p4"><tt><br>
            </tt></p>
          <p class="p3"><tt><span class="s1">import</span>
              javax.inject.Inject;</tt></p>
          <p class="p3"><tt><span class="s1">import</span>
              javax.interceptor.AroundInvoke;</tt></p>
          <p class="p3"><tt><span class="s1">import</span>
              javax.interceptor.Interceptor;</tt></p>
          <p class="p3"><tt><span class="s1">import</span>
              javax.interceptor.InvocationContext;</tt></p>
          <p class="p4"><tt><br>
            </tt></p>
          <p class="p5"><tt>/**</tt></p>
          <p class="p5"><tt>&nbsp;* <span class="s2">@author</span> <span class="s3">Richard</span> <span class="s3">Hightower</span></tt></p>
          <p class="p5"><tt>&nbsp;*/</tt></p>
          <p class="p6"><tt>@Secure<span class="s4"> </span>@Interceptor</tt></p>
          <p class="p3"><tt><span class="s1">public</span> <span class="s1">class</span> SecurityAdvice {</tt></p>
          <p class="p3"><tt>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</tt></p>
          <p class="p3"><tt>&nbsp; &nbsp; &nbsp; &nbsp; <span class="s5">@Inject</span></tt></p>
          <p class="p3"><tt>&nbsp; &nbsp; &nbsp; &nbsp; <span class="s1">private</span>
              SecurityService <span class="s6">securityManager</span>;</tt></p>
          <p class="p4"><tt><br>
            </tt></p>
          <p class="p6"><tt><span class="s4">&nbsp; &nbsp; &nbsp; &nbsp; </span>@AroundInvoke</tt></p>
          <p class="p3"><tt>&nbsp; &nbsp; &nbsp; &nbsp; <span class="s1">public</span> <span class="s1">void</span> checkSecurity(InvocationContext
              joinPoint) <span class="s1">throws</span> Exception {</tt></p>
          <p class="p3"><tt>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-tab-span"> </span></tt></p>
          <p class="p3"><tt>&nbsp; &nbsp; &nbsp; &nbsp; <span class="Apple-tab-span"> </span>System.<span class="s6">out</span>.println(<span class="s7">"In
                SecurityAdvice"</span>);</tt></p>
          <p class="p3"><tt>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</tt></p>
          <p class="p7"><tt><span class="s4">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>/* If
              the user is not logged in, don't let them use this method
              */</tt></p>
          <p class="p3"><tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="s1">if</span>(!<span class="s6">securityManager</span>.isLoggedIn()){ &nbsp; &nbsp; &nbsp; &nbsp;
              &nbsp; &nbsp;</tt></p>
          <p class="p3"><tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="s1">throw</span>
              <span class="s1">new</span> SecurityViolationException();</tt></p>
          <p class="p3"><tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</tt></p>
          <p class="p4"><tt><br>
            </tt></p>
          <p class="p7"><tt><span class="s4">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>/* Get
              the name of the method being invoked. */</tt></p>
          <p class="p3"><tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String operationName =
              joinPoint.getMethod().getName();</tt></p>
          <p class="p7"><tt><span class="s4">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>/* Get
              the name of the object being invoked. */</tt></p>
          <p class="p3"><tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String objectName =
              joinPoint.getTarget().getClass().getName();</tt></p>
          <p class="p4"><tt><br>
            </tt></p>
          <p class="p4"><tt><br>
            </tt></p>
          <p class="p3"><tt>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="s8">/*</span></tt></p>
          <p class="p7"><tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; * Invoke the method or next <span class="s3">Interceptor</span> in the list,</tt></p>
          <p class="p7"><tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; * if the current user is
              allowed.</tt></p>
          <p class="p7"><tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */</tt></p>
          <p class="p3"><tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="s1">if</span> (!<span class="s6">securityManager</span>.isAllowed(objectName,
              operationName)){</tt></p>
          <p class="p3"><tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="s1">throw</span>
              <span class="s1">new</span> SecurityViolationException();</tt></p>
          <p class="p3"><tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</tt></p>
          <p class="p3"><tt>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</tt></p>
          <p class="p3"><tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; joinPoint.proceed();</tt></p>
          <p class="p3"><tt>&nbsp; &nbsp; &nbsp; &nbsp; }</tt></p>
          <p class="p3"><tt>}</tt></p>
          <p class="p4"><tt><br>
            </tt></p>
          <p class="p3"><tt>Weld does not recognize it because it
              returns void. It fails silently.</tt></p>
          <p class="p3"><tt>Candi recognizes it and uses it.</tt></p>
          <p class="p3"><tt>OpenWebBeans throws an exception as follows:</tt></p>
          <p class="p4"><tt><br>
            </tt></p>
          <p class="p4"><tt><br>
            </tt></p>
          <p class="p4"><tt><br>
            </tt></p>
          <p class="p8"><tt><span class="s9">org.apache.webbeans.exception.WebBeansConfigurationException</span>:
              @AroundInvoke annotated method : checkSecurity in class :
              org.cdi.advocacy.security.SecurityAdvice must return
              Object type</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
org.apache.webbeans.util.WebBeansUtil.checkAroundInvokeAnnotationCriterias(<span class="s9">WebBeansUtil.java:1094</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.apache.webbeans.util.WebBeansUtil.configureInterceptorMethods(<span class="s9">WebBeansUtil.java:1241</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
org.apache.webbeans.intercept.WebBeansInterceptorConfig.addMethodInterceptors(<span class="s9">WebBeansInterceptorConfig.java:349</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.apache.webbeans.intercept.WebBeansInterceptorConfig.configure(<span class="s9">WebBeansInterceptorConfig.java:250</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.apache.webbeans.config.DefinitionUtil.defineBeanInterceptorStack(<span class="s9">DefinitionUtil.java:1058</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.apache.webbeans.config.BeansDeployer.validate(<span class="s9">BeansDeployer.java:365</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.apache.webbeans.config.BeansDeployer.validateInjectionPoints(<span class="s9">BeansDeployer.java:326</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.apache.webbeans.config.BeansDeployer.deploy(<span class="s9">BeansDeployer.java:179</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.apache.webbeans.lifecycle.AbstractLifeCycle.startApplication(<span class="s9">AbstractLifeCycle.java:123</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.cdiadvocate.beancontainer.OpenWebBeansBeanContainer.doStart(<span class="s9">OpenWebBeansBeanContainer.java:26</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.cdiadvocate.beancontainer.AbstractBeanContainer.start(<span class="s9">AbstractBeanContainer.java:111</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.cdi.advocacy.AtmMain.&lt;clinit&gt;(<span class="s9">AtmMain.java:25</span>)</tt></p>
          <p class="p8"><tt>Exception in thread "main"
              java.lang.ExceptionInInitializerError</tt></p>
          <p class="p8"><tt>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</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.cdiadvocate.beancontainer.AbstractBeanContainer.start(<span class="s9">AbstractBeanContainer.java:113</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.cdi.advocacy.AtmMain.&lt;clinit&gt;(<span class="s9">AtmMain.java:25</span>)</tt></p>
          <p class="p8"><tt>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</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
org.apache.webbeans.util.WebBeansUtil.checkAroundInvokeAnnotationCriterias(<span class="s9">WebBeansUtil.java:1094</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.apache.webbeans.util.WebBeansUtil.configureInterceptorMethods(<span class="s9">WebBeansUtil.java:1241</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
org.apache.webbeans.intercept.WebBeansInterceptorConfig.addMethodInterceptors(<span class="s9">WebBeansInterceptorConfig.java:349</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.apache.webbeans.intercept.WebBeansInterceptorConfig.configure(<span class="s9">WebBeansInterceptorConfig.java:250</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.apache.webbeans.config.DefinitionUtil.defineBeanInterceptorStack(<span class="s9">DefinitionUtil.java:1058</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.apache.webbeans.config.BeansDeployer.validate(<span class="s9">BeansDeployer.java:365</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.apache.webbeans.config.BeansDeployer.validateInjectionPoints(<span class="s9">BeansDeployer.java:326</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.apache.webbeans.config.BeansDeployer.deploy(<span class="s9">BeansDeployer.java:179</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.apache.webbeans.lifecycle.AbstractLifeCycle.startApplication(<span class="s9">AbstractLifeCycle.java:123</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.cdiadvocate.beancontainer.OpenWebBeansBeanContainer.doStart(<span class="s9">OpenWebBeansBeanContainer.java:26</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>at
              org.cdiadvocate.beancontainer.AbstractBeanContainer.start(<span class="s9">AbstractBeanContainer.java:111</span>)</tt></p>
          <p class="p8"><tt><span class="Apple-tab-span"> </span>... 1
              more</tt></p>
          <p class="p2"><tt><br>
            </tt></p>
          <p class="p1"><tt>I think CDI 1.1 should clarify the behavior
              and I think it should support return types of void.</tt></p>
          <tt>-- <br>
            <b>Rick Hightower</b><br>
            (415) 968-9037 <br>
            <a href="http://www.google.com/profiles/RichardHightower" target="_blank">Profile</a>&nbsp;<br>
            <br>
          </tt>
        </div>
      </div>
      <pre><tt>
</tt><fieldset class="mimeAttachmentHeader"></fieldset><tt>
_______________________________________________
cdi-dev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:cdi-dev@lists.jboss.org" target="_blank">cdi-dev@lists.jboss.org</a>
<a class="moz-txt-link-freetext" href="https://lists.jboss.org/mailman/listinfo/cdi-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/cdi-dev</a>
</tt></pre>
    </blockquote>
    <tt><br>
    </tt>
  <br>_______________________________________________<br>cdi-dev mailing list<br>cdi-dev@lists.jboss.org<br>https://lists.jboss.org/mailman/listinfo/cdi-dev<br></div><br></div></body></html>