[ 
https://issues.apache.org/struts/browse/WW-2602?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Toni Lyytikäinen updated WW-2602:
---------------------------------

    Attachment: Struts2-issue2602.zip

Here's a very basic sample project using maven 2 to demonstrate the problem. If 
you disable the Spring plugin, then it'll work fine. If you have it enabled 
then you'll get the exception. If you look at the Spring configuration and the 
MyAction class, it is quite obvious that Spring *should* have nothing to do 
when the class is instantiated, but it still somehow manages to make a mess of 
it.

Use mvn jetty:run to run it.

> Struts 2 Spring plugin conflicts with ServletRequestAware
> ---------------------------------------------------------
>
>                 Key: WW-2602
>                 URL: https://issues.apache.org/struts/browse/WW-2602
>             Project: Struts 2
>          Issue Type: Bug
>          Components: Plugin - Spring
>    Affects Versions: 2.1.1
>         Environment: Linux 2.6.24 x86_64, Jetty, Struts 2.1.1-SNAPSHOT, XWork 
> 2.1.1-SNAPSHOT, Spring plugin 2.1.1-SNAPSHOT
>            Reporter: Toni Lyytikäinen
>            Priority: Critical
>         Attachments: Struts2-issue2602.zip
>
>
> If you have an action class that implements the ServletRequestAware interface 
> and has the corresponding setServletRequest method to it, Spring will try to 
> inject a HttpServletRequest into it, causing an exception:
> Unable to instantiate Action, web.MyAction,  defined for 'form' in namespace 
> '/'No thread-bound request found: Are you referring to request attributes 
> outside of an actual web request, or processing a request outside of the 
> originally receiving thread? 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 case, use 
> RequestContextListener or RequestContextFilter to expose the current request.
> Caused by:
> Unable to instantiate Action, web.MyAction,  defined for 'form' in namespace 
> '/'No thread-bound request found: Are you referring to request attributes 
> outside of an actual web request, or processing a request outside of the 
> originally receiving thread? 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 case, use 
> RequestContextListener or RequestContextFilter to expose the current request.
>       at 
> com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:300)
>       at 
> com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:381)
>       at 
> com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:187)
>       at 
> org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:60)
>       at 
> org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:38)
>       at 
> com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47)
>       at 
> org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:466)
>       at 
> org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:458)
>       at 
> org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
>       at 
> org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
>       at 
> org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
>       at 
> org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
>       at 
> org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726)
>       at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
>       at 
> org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206)
>       at 
> org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
>       at 
> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
>       at org.mortbay.jetty.Server.handle(Server.java:324)
>       at 
> org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
>       at 
> org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:828)
>       at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
>       at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
>       at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
>       at 
> org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
>       at 
> org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:450)
> Caused by: java.lang.IllegalStateException: No thread-bound request found: 
> Are you referring to request attributes outside of an actual web request, or 
> processing a request outside of the originally receiving thread? 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 case, use RequestContextListener or RequestContextFilter to expose the 
> current request.
>       at 
> org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:121)
>       at 
> org.springframework.web.context.support.WebApplicationContextUtils$1.getObject(WebApplicationContextUtils.java:113)
>       at 
> org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:660)
>       at 
> org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:610)
>       at 
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1074)
>       at 
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:980)
>       at 
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:329)
>       at 
> com.opensymphony.xwork2.spring.SpringObjectFactory.autoWireBean(SpringObjectFactory.java:167)
>       at 
> com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:154)
>       at 
> com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:128)
>       at 
> com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:137)
>       at 
> com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:107)
>       at 
> com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:281)
>       ... 24 more
> This can be fixed by adding the following to web.xml:
> <listener>
>    
> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
> </listener>
> But this seems only a workaround and might cause some unwanted side-effects.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to