<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#ffffff">
<tt>On Monday 16 May 2011 12:44 PM, Marius Bogoevici wrote:</tt>
<blockquote
cite="mid:e5479ff3-796e-4fb1-9a77-38ded720147e@vonlipwig"
type="cite">
<style type="text/css">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>
-Jaikiran <br>
</tt>
<blockquote
cite="mid:e5479ff3-796e-4fb1-9a77-38ded720147e@vonlipwig"
type="cite">
<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"><jpai@redhat.com></a><br>
<b>To: </b><a class="moz-txt-link-abbreviated" href="mailto:cdi-dev@lists.jboss.org">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>
<quote><br>
Around-invoke methods have the following signature:<br>
<br>
Object <METHOD>(InvocationContext) throws Exception<br>
<br>
</quote><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> * <span class="s2">@author</span> <span
class="s3">Richard</span> <span class="s3">Hightower</span></tt></p>
<p class="p5"><tt> */</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> </tt></p>
<p class="p3"><tt> <span class="s5">@Inject</span></tt></p>
<p class="p3"><tt> <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"> </span>@AroundInvoke</tt></p>
<p class="p3"><tt> <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> <span class="Apple-tab-span">
</span></tt></p>
<p class="p3"><tt> <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> </tt></p>
<p class="p7"><tt><span class="s4"> </span>/*
If the user is not logged in, don't let them use
this method */</tt></p>
<p class="p3"><tt> <span class="s1">if</span>(!<span
class="s6">securityManager</span>.isLoggedIn()){
</tt></p>
<p class="p3"><tt> <span class="s1">throw</span>
<span class="s1">new</span>
SecurityViolationException();</tt></p>
<p class="p3"><tt> }</tt></p>
<p class="p4"><tt><br>
</tt></p>
<p class="p7"><tt><span class="s4"> </span>/*
Get the name of the method being invoked. */</tt></p>
<p class="p3"><tt> String operationName =
joinPoint.getMethod().getName();</tt></p>
<p class="p7"><tt><span class="s4"> </span>/*
Get the name of the object being invoked. */</tt></p>
<p class="p3"><tt> 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> <span class="s8">/*</span></tt></p>
<p class="p7"><tt> * Invoke the method or
next <span class="s3">Interceptor</span> in the
list,</tt></p>
<p class="p7"><tt> * if the current user is
allowed.</tt></p>
<p class="p7"><tt> */</tt></p>
<p class="p3"><tt> <span class="s1">if</span>
(!<span class="s6">securityManager</span>.isAllowed(objectName,
operationName)){</tt></p>
<p class="p3"><tt> <span class="s1">throw</span>
<span class="s1">new</span>
SecurityViolationException();</tt></p>
<p class="p3"><tt> }</tt></p>
<p class="p3"><tt> </tt></p>
<p class="p3"><tt> joinPoint.proceed();</tt></p>
<p class="p3"><tt> }</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.<clinit>(<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.<clinit>(<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 moz-do-not-send="true"
href="http://www.google.com/profiles/RichardHightower"
target="_blank">Profile</a> <br>
<br>
</tt> </div>
</div>
<pre><tt>
</tt><fieldset class="mimeAttachmentHeader"></fieldset><tt>
_______________________________________________
cdi-dev mailing list
<a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:cdi-dev@lists.jboss.org" target="_blank">cdi-dev@lists.jboss.org</a>
<a moz-do-not-send="true" 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">cdi-dev@lists.jboss.org</a><br>
<a class="moz-txt-link-freetext" href="https://lists.jboss.org/mailman/listinfo/cdi-dev">https://lists.jboss.org/mailman/listinfo/cdi-dev</a><br>
</tt></div>
<tt><br>
</tt></div>
</blockquote>
<tt><br>
</tt>
</body>
</html>