You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Will Smith <bu...@gmail.com> on 2007/05/18 19:27:29 UTC

Struts 2 providing injection

Hi, I have an action that I've been injecting with Guice. I just noticed
that there is an @Inject annotation defined in
com.opensymphony.xwork2.inject. I'm assuming that this allows you to use
struts 2 as the di provider. So I tried removing my
com.google.inject.*imports that bring in the @Inject annotation, to
see if struts would pick
this up. It didn't, and I get an error in my netbeans tomcat window. I was
unable to find any @Singleton type annotation so that I could apply the
correct scope to my class being injected, so I left the Guice one.

Am I correct in assuming that the @Inject annotation provided by struts2 is
to allow struts to do the di? If so, is there any documentation on this?
Also, while troubleshooting, I tried both specifiying Guice as the
objectFactory, and not specifying it. It didn't matter either way.

Thanks,
Will


This is the error:

1) Error at com.bugnthecode.blog.actions.BlogService.<init>(BlogService.java
:32):
 Could not find a suitable constructor in
com.bugnthecode.blog.actions.BlogService. Classes must have either one (and
only one) constructor annotated with @Inject or a zero-argument constructor.

1 error[s]
        at com.google.inject.BinderImpl.createInjector(BinderImpl.java:277)
        at com.google.inject.Guice.createInjector(Guice.java:79)
        at com.google.inject.Guice.createInjector(Guice.java:53)
        at com.google.inject.Guice.createInjector(Guice.java:43)
        at com.google.inject.struts2.GuiceObjectFactory.buildBean(
GuiceObjectFactory.java:101)
        at com.opensymphony.xwork2.ObjectFactory.buildBean(
ObjectFactory.java:152)
        at com.opensymphony.xwork2.ObjectFactory.buildBean(
ObjectFactory.java:141)
        at com.opensymphony.xwork2.ObjectFactory.buildAction(
ObjectFactory.java:111)
        at com.opensymphony.xwork2.DefaultActionInvocation.createAction(
DefaultActionInvocation.java:270)
        at com.opensymphony.xwork2.DefaultActionInvocation.init(
DefaultActionInvocation.java:360)
        at com.opensymphony.xwork2.DefaultActionInvocation.access$000(
DefaultActionInvocation.java:38)
        at com.opensymphony.xwork2.DefaultActionInvocation$1.doProfiling(
DefaultActionInvocation.java:78)
        at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(
UtilTimerStack.java:455)
        at com.opensymphony.xwork2.DefaultActionInvocation.<init>(
DefaultActionInvocation.java:70)
        at com.opensymphony.xwork2.DefaultActionInvocation.<init>(
DefaultActionInvocation.java:66)
        at com.opensymphony.xwork2.DefaultActionProxy.prepare(
DefaultActionProxy.java:189)
        at
org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(
StrutsActionProxyFactory.java:41)
        at org.apache.struts2.dispatcher.Dispatcher.serviceAction(
Dispatcher.java:497)
        at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(
FilterDispatcher.java:421)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(
ApplicationFilterChain.java:173)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(
MonitorFilter.java:368)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(
ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(
StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(
StandardContextValve.java:178)
        at org.apache.catalina.core.StandardHostValve.invoke(
StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(
ErrorReportValve.java:105)
        at org.apache.catalina.core.StandardEngineValve.invoke(
StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(
CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(
Http11Processor.java:869)
        at
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection
(Http11BaseProtocol.java:664)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(
PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(
LeaderFollowerWorkerThread.java:80)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(
ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:619)

Re: Struts 2 providing injection

Posted by Ian Roughley <ia...@fdar.com>.
Struts2, or more precisely XWork, uses an early version of Guice. 

I was wondering about doing the same thing on a current project, and my 
initial thought was that you would need to define the beans being 
injected via the struts.xml configuration file or to provide a way to 
supply the managed beans in to the Guice container.  I'm not sure that 
it will automatically find annotation on application code.

Bob?

/Ian


Will Smith wrote:
> Hi, I have an action that I've been injecting with Guice. I just noticed
> that there is an @Inject annotation defined in
> com.opensymphony.xwork2.inject. I'm assuming that this allows you to use
> struts 2 as the di provider. So I tried removing my
> com.google.inject.*imports that bring in the @Inject annotation, to
> see if struts would pick
> this up. It didn't, and I get an error in my netbeans tomcat window. I 
> was
> unable to find any @Singleton type annotation so that I could apply the
> correct scope to my class being injected, so I left the Guice one.
>
> Am I correct in assuming that the @Inject annotation provided by 
> struts2 is
> to allow struts to do the di? If so, is there any documentation on this?
> Also, while troubleshooting, I tried both specifiying Guice as the
> objectFactory, and not specifying it. It didn't matter either way.
>
> Thanks,
> Will
>
>
> This is the error:
>
> 1) Error at 
> com.bugnthecode.blog.actions.BlogService.<init>(BlogService.java
> :32):
> Could not find a suitable constructor in
> com.bugnthecode.blog.actions.BlogService. Classes must have either one 
> (and
> only one) constructor annotated with @Inject or a zero-argument 
> constructor.
>
> 1 error[s]
>        at 
> com.google.inject.BinderImpl.createInjector(BinderImpl.java:277)
>        at com.google.inject.Guice.createInjector(Guice.java:79)
>        at com.google.inject.Guice.createInjector(Guice.java:53)
>        at com.google.inject.Guice.createInjector(Guice.java:43)
>        at com.google.inject.struts2.GuiceObjectFactory.buildBean(
> GuiceObjectFactory.java:101)
>        at com.opensymphony.xwork2.ObjectFactory.buildBean(
> ObjectFactory.java:152)
>        at com.opensymphony.xwork2.ObjectFactory.buildBean(
> ObjectFactory.java:141)
>        at com.opensymphony.xwork2.ObjectFactory.buildAction(
> ObjectFactory.java:111)
>        at com.opensymphony.xwork2.DefaultActionInvocation.createAction(
> DefaultActionInvocation.java:270)
>        at com.opensymphony.xwork2.DefaultActionInvocation.init(
> DefaultActionInvocation.java:360)
>        at com.opensymphony.xwork2.DefaultActionInvocation.access$000(
> DefaultActionInvocation.java:38)
>        at com.opensymphony.xwork2.DefaultActionInvocation$1.doProfiling(
> DefaultActionInvocation.java:78)
>        at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(
> UtilTimerStack.java:455)
>        at com.opensymphony.xwork2.DefaultActionInvocation.<init>(
> DefaultActionInvocation.java:70)
>        at com.opensymphony.xwork2.DefaultActionInvocation.<init>(
> DefaultActionInvocation.java:66)
>        at com.opensymphony.xwork2.DefaultActionProxy.prepare(
> DefaultActionProxy.java:189)
>        at
> org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(
> StrutsActionProxyFactory.java:41)
>        at org.apache.struts2.dispatcher.Dispatcher.serviceAction(
> Dispatcher.java:497)
>        at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(
> FilterDispatcher.java:421)
>        at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
> ApplicationFilterChain.java:202)
>        at org.apache.catalina.core.ApplicationFilterChain.doFilter(
> ApplicationFilterChain.java:173)
>        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(
> MonitorFilter.java:368)
>        at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
> ApplicationFilterChain.java:202)
>        at org.apache.catalina.core.ApplicationFilterChain.doFilter(
> ApplicationFilterChain.java:173)
>        at org.apache.catalina.core.StandardWrapperValve.invoke(
> StandardWrapperValve.java:213)
>        at org.apache.catalina.core.StandardContextValve.invoke(
> StandardContextValve.java:178)
>        at org.apache.catalina.core.StandardHostValve.invoke(
> StandardHostValve.java:126)
>        at org.apache.catalina.valves.ErrorReportValve.invoke(
> ErrorReportValve.java:105)
>        at org.apache.catalina.core.StandardEngineValve.invoke(
> StandardEngineValve.java:107)
>        at org.apache.catalina.connector.CoyoteAdapter.service(
> CoyoteAdapter.java:148)
>        at org.apache.coyote.http11.Http11Processor.process(
> Http11Processor.java:869)
>        at
> org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection 
>
> (Http11BaseProtocol.java:664)
>        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(
> PoolTcpEndpoint.java:527)
>        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(
> LeaderFollowerWorkerThread.java:80)
>        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(
> ThreadPool.java:684)
>        at java.lang.Thread.run(Thread.java:619)
>

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