You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Steve C <st...@gmail.com> on 2007/06/27 21:14:09 UTC

Struts 2 interceptor and spring problem

Hello.  I am in the process of migrating my application from webwork
2.2.x to Struts 2 and have encountered a problem.  I have a custom
interceptor which has a member variable injected by Spring.  This
object is a request scoped bean which is contructed using a factory
method from another bean which is a singleton.  So, it looks like
something like this:


MyInterceptor
-->private RequestBasedBean rbb
--> @required
     void setRequestBasedBean


in applicationContext.xml:

  <bean id="factory" class="com.blah.mypackage.myclass" scope="singleton">
    <bunch of stuff here>
  </bean>

  <bean id="sessionFactory" factory-bean="factory" factory-method="getFactory"
      scope="singleton"/>

  <bean id="requestBasedBean" factory-bean="sessionFactory"
factory-method="openSession"  destroy-method="close" scope="request"
/>


This worked fine in webwork, but in struts 2, it looks like it is
trying to construct MyInterceptor at startup time and failing because
when it injects the requestBaseBean, there is no request context and
it fails (Stack trace below).  Note that I am using a request-scoped
bean and it is sort of referred to by a singleton, but I don't think I
need to use a scoped-proxy (which fails anyways, I tried it).  Again,
this worked fine in the WebWork implementation.  So, I'm trying to see

a) what changed with struts 2 interceptor intialization.
b) if it isn't technically a struts 2 problem, what workaround exist
in Spring (I may take this to the spring forums if this is not an
issue around struts 2).

Thanks!  And there is a reason why there are all the singletons and
factory stuff.  Related to legacy support and non-spring aware code.

-Steve


Caused by: org.springframework.beans.factory.BeanCreationException: Error creati
ng bean with name 'requestBasedBean': Scope 'request' is not active
for the current thread; consider defining a scoped proxy for this bean
if you intend to refer to it from a singleton; nested exception is
java.lang.IllegalStateException: No thre
ad-bound request found: Are you referring to request attributes outside of an ac
tual web request? If you are actually operating within a web request and still r
eceive this message,your code is probably running outside of DispatcherServlet/D
ispatcherPortlet: In this case, use RequestContextListener or RequestContextFilt
er to expose the current request.
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean
(AbstractBeanFactory.java:304)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean
(AbstractBeanFactory.java:160)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBean
Factory.autowireByName(AbstractAutowireCapableBeanFactory.java:880)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBean
Factory.populateBean(AbstractAutowireCapableBeanFactory.java:828)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBean
Factory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:273)
        at com.opensymphony.xwork2.spring.SpringObjectFactory.autoWireBean(Sprin
gObjectFactory.java:167)
        at com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringOb
jectFactory.java:154)
        at com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringOb
jectFactory.java:128)
        at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:14
3)
        at com.opensymphony.xwork2.ObjectFactory.buildInterceptor(ObjectFactory.
java:184)
        ... 52 more
Caused by: java.lang.IllegalStateException: No thread-bound request found: Are y
ou referring to request attributes outside of an actual web request? If you are
actually operating within a web request and still receive this message,your code
 is probably running outside of DispatcherServlet/DispatcherPortlet: In this cas
e, use RequestContextListener or RequestContextFilter to expose the current requ
est.
        at org.springframework.web.context.request.RequestContextHolder.currentR
equestAttributes(RequestContextHolder.java:102)
        at org.springframework.web.context.request.AbstractRequestAttributesScop
e.get(AbstractRequestAttributesScope.java:40)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean
(AbstractBeanFactory.java:285)
        ... 61 more

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Struts 2 interceptor and spring problem

Posted by Steve C <st...@gmail.com>.
BTW, I did see this:

https://issues.apache.org/struts/browse/WW-1576

but i'm using struts 2.0.8 and the xwork version is 2.0.3.  Is this
still an xwork problem that I should ask about on opensymphony?

On 6/27/07, Steve C <st...@gmail.com> wrote:
> Hello.  I am in the process of migrating my application from webwork
> 2.2.x to Struts 2 and have encountered a problem.  I have a custom
> interceptor which has a member variable injected by Spring.  This
> object is a request scoped bean which is contructed using a factory
> method from another bean which is a singleton.  So, it looks like
> something like this:
>
>
> MyInterceptor
> -->private RequestBasedBean rbb
> --> @required
>     void setRequestBasedBean
>
>
> in applicationContext.xml:
>
>  <bean id="factory" class="com.blah.mypackage.myclass" scope="singleton">
>    <bunch of stuff here>
>  </bean>
>
>  <bean id="sessionFactory" factory-bean="factory" factory-method="getFactory"
>      scope="singleton"/>
>
>  <bean id="requestBasedBean" factory-bean="sessionFactory"
> factory-method="openSession"  destroy-method="close" scope="request"
> />
>
>
> This worked fine in webwork, but in struts 2, it looks like it is
> trying to construct MyInterceptor at startup time and failing because
> when it injects the requestBaseBean, there is no request context and
> it fails (Stack trace below).  Note that I am using a request-scoped
> bean and it is sort of referred to by a singleton, but I don't think I
> need to use a scoped-proxy (which fails anyways, I tried it).  Again,
> this worked fine in the WebWork implementation.  So, I'm trying to see
>
> a) what changed with struts 2 interceptor intialization.
> b) if it isn't technically a struts 2 problem, what workaround exist
> in Spring (I may take this to the spring forums if this is not an
> issue around struts 2).
>
> Thanks!  And there is a reason why there are all the singletons and
> factory stuff.  Related to legacy support and non-spring aware code.
>
> -Steve
>
>
> Caused by: org.springframework.beans.factory.BeanCreationException: Error creati
> ng bean with name 'requestBasedBean': Scope 'request' is not active
> for the current thread; consider defining a scoped proxy for this bean
> if you intend to refer to it from a singleton; nested exception is
> java.lang.IllegalStateException: No thre
> ad-bound request found: Are you referring to request attributes outside of an ac
> tual web request? If you are actually operating within a web request and still r
> eceive this message,your code is probably running outside of DispatcherServlet/D
> ispatcherPortlet: In this case, use RequestContextListener or RequestContextFilt
> er to expose the current request.
>        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean
> (AbstractBeanFactory.java:304)
>        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean
> (AbstractBeanFactory.java:160)
>        at org.springframework.beans.factory.support.AbstractAutowireCapableBean
> Factory.autowireByName(AbstractAutowireCapableBeanFactory.java:880)
>        at org.springframework.beans.factory.support.AbstractAutowireCapableBean
> Factory.populateBean(AbstractAutowireCapableBeanFactory.java:828)
>        at org.springframework.beans.factory.support.AbstractAutowireCapableBean
> Factory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:273)
>        at com.opensymphony.xwork2.spring.SpringObjectFactory.autoWireBean(Sprin
> gObjectFactory.java:167)
>        at com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringOb
> jectFactory.java:154)
>        at com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringOb
> jectFactory.java:128)
>        at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:14
> 3)
>        at com.opensymphony.xwork2.ObjectFactory.buildInterceptor(ObjectFactory.
> java:184)
>        ... 52 more
> Caused by: java.lang.IllegalStateException: No thread-bound request found: Are y
> ou referring to request attributes outside of an actual web request? If you are
> actually operating within a web request and still receive this message,your code
>  is probably running outside of DispatcherServlet/DispatcherPortlet: In this cas
> e, use RequestContextListener or RequestContextFilter to expose the current requ
> est.
>        at org.springframework.web.context.request.RequestContextHolder.currentR
> equestAttributes(RequestContextHolder.java:102)
>        at org.springframework.web.context.request.AbstractRequestAttributesScop
> e.get(AbstractRequestAttributesScope.java:40)
>        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean
> (AbstractBeanFactory.java:285)
>        ... 61 more
>

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org