Wesley Wu wrote:
> Hi Scott,
>
> When a @ApplicationScoped/@Singleton bean is designed to be initialized
> after webapp starts (I.E. when first http request was fired) instead of being
> initialized during startup stage, in given circumstance, it won't be
> injected correctly.
>   
Thanks for tracking this down. It looks like a circularity problem, 
which we should handle but our current tests don't have exactly this 
configuration.

-- Scott
> This is my test case:
>
> ========== StartBean ===========
> public class StartBean {
>       @Inject
>       FirstBean firstBean;
> }
> ========== FirstBean  ===========
> public class FirstBean {
>       @Inject
>       SecondBean secondBean;
> }
> ========== SecondBean ===========
> public class SecondBean {
>       @Inject
>       ThirdBean thirdBean;
>       @Inject
>       FourthBean fourthBean;
> }
> ========== ThirdBean ===========
> public class ThirdBean {
>       @Inject
>       SingletonBean singletonBean;
> }
> ========== FourthBean ===========
> public class FourthBean {
>       @Inject
>       SingletonBean dao;
> }
> ========== SingletonBean  ===========
> @Singleton
> //@Startup
> public class SingletonBean {
> }
> ========== MyServlet ===========
> public class MyServlet extends HttpServlet {
>       @Inject
>       StartBean startBean;
>
>       protected void doGet(HttpServletRequest request, HttpServletResponse 
> response)
>                       throws ServletException, IOException {
>               System.out.println("hello");
>       }
> }
>
> ========= web.xml ===========
> <?xml version="1.0" encoding="UTF-8"?>
> <web-app xmlns="http://java.sun.com/xml/ns/javaee";
>            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
>                 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd";
>            version="2.5">
>
>       <servlet id="MyServlet">
>               <servlet-name>MyServlet</servlet-name>
>               <servlet-class>com.mycompany.servlet.MyServlet</servlet-class>
>       </servlet>
>       <servlet-mapping>
>               <servlet-name>MyServlet</servlet-name>
>               <url-pattern>/MyServlet</url-pattern>
>       </servlet-mapping>
> </web-app>
>
> =================================
>
> The "http://localhost:8080/MyServlet"; request will produce this exception:
>
> com.mycompany.servlet.MyServlet.startBean:
> com.mycompany.beans.StartBean.firstBean:
> com.mycompany.beans.FirstBean.secondBean:
> com.mycompany.beans.SecondBean.fourthBean:
> com.mycompany.beans.FourthBean.singletonBean:
> java.lang.IllegalArgumentException:
> Can not set com.mycompany.beans.SingletonBean field
> com.mycompany.beans.FourthBean.singletonBean
> to com.mycompany.beans.FourthBean
>
> When I annotate the SingletonBean as @Startup, it's fine. (uncomment
> the //@Startup line in SingletonBean.java)
>
> Either @Singleton or @ApplicationScoped throws the exception.
>
> It's a weird bug, taking me nearly two days to reproduce it in such a
> simple test case.
>
> -Wesley
>
>
> _______________________________________________
> resin-interest mailing list
> resin-interest@caucho.com
> http://maillist.caucho.com/mailman/listinfo/resin-interest
>
>   



_______________________________________________
resin-interest mailing list
resin-interest@caucho.com
http://maillist.caucho.com/mailman/listinfo/resin-interest

Reply via email to