<html><head><style type='text/css'>p { margin: 0; }</style></head><body><div style='font-family: Arial; font-size: 10pt; color: #000000'><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>"Marius Bogoevici" &lt;mariusb@redhat.com&gt;<br><b>Cc: </b>cdi-dev@lists.jboss.org<br><b>Sent: </b>Monday, May 16, 2011 3:18:16 AM<br><b>Subject: </b>Re: [cdi-dev] interceptor that return void, unclear in 1.0 specification, needs clarification in 1.1<br><br>

  
    
  
    <tt>On Monday 16 May 2011 12:44 PM, Marius Bogoevici wrote:</tt>
    <blockquote cite="mid:e5479ff3-796e-4fb1-9a77-38ded720147e@vonlipwig">
      <style>p { margin: 0; }</style>
      <div style="font-family: Arial; font-size: 10pt; color: rgb(0, 0, 0);"><tt>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>
        </tt></div>
    </blockquote>
    <tt>IMO, if a target bean is specifically marking an interceptor
      (via @Interceptors) and that interceptor is having some incorrect
      construct, then I guess it makes sense to fail the deployment.
      After all, that interceptor is unusable and ultimately will have
      an impact on the bean operations. <br><br></tt>That's the general idea. There are, however, some ambiguities regarding lifecycle interceptor methods - see CDI-82.<tt><br><br>
      -Jaikiran &nbsp; <br>
    </tt>
    <blockquote cite="mid:e5479ff3-796e-4fb1-9a77-38ded720147e@vonlipwig">
      <div style="font-family: Arial; font-size: 10pt; color: rgb(0, 0, 0);"><tt><br>
        </tt>
        <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;"><tt><b>From: </b>"Jaikiran
            Pai" <a class="moz-txt-link-rfc2396E" href="mailto:jpai@redhat.com" target="_blank">&lt;jpai@redhat.com&gt;</a><br>
            <b>To: </b><a class="moz-txt-link-abbreviated" href="mailto:cdi-dev@lists.jboss.org" target="_blank">cdi-dev@lists.jboss.org</a><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>
          </tt>
          <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>
            <br>
            _______________________________________________</tt> <tt><br>
            cdi-dev mailing list<br>
            <a class="moz-txt-link-abbreviated" href="mailto:cdi-dev@lists.jboss.org" target="_blank">cdi-dev@lists.jboss.org</a><br>
            <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><br>
          </tt></div>
        <tt><br>
        </tt></div>
    </blockquote>
    <tt><br>
    </tt>
  </div><br></div></body></html>