How to put Spring object in Struts application scope on web startup?

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

How to put Spring object in Struts application scope on web startup?

Burton Rhodes
How do you put a Spring object into the Struts application scope Map on
startup of a web application?  I have 2 listeners that I thought would be
the usual suspects, but have not had success yet.

I have a ServletContextListener class but on the
contextInitialized(ServletContextEvent event) method, my spring bean has
not been created yet.

Secondly, I have a Spring "ApplicationListener", but in the
onApplicationEvent(ApplicationEvent event) method,
"ServletActionContext.getContext()" is null.  How is this traditionally
accomplished?

Thanks!
Burton
Reply | Threaded
Open this post in threaded view
|

Re: How to put Spring object in Struts application scope on web startup?

adam brin
it’s a mixture of things:

* Struts.xml should be setup to know about spring:
    <constant name="struts.objectFactory"
        value="org.apache.struts2.spring.StrutsSpringObjectFactory" />
    <constant name="struts.objectFactory.spring.autoWire.alwaysRespect" value="true" />
    <constant name="struts.objectFactory.spring.autoWire" value="name" />

* register the appropriate application listeners

* add the @Scope variables  to controllers

--
_________________________________________________________
Adam Brin
Director of Technology, Digital Antiquity
480.965.1278

> On Sep 29, 2017, at 9:03 AM, Burton Rhodes <[hidden email]> wrote:
>
> How do you put a Spring object into the Struts application scope Map on
> startup of a web application?  I have 2 listeners that I thought would be
> the usual suspects, but have not had success yet.
>
> I have a ServletContextListener class but on the
> contextInitialized(ServletContextEvent event) method, my spring bean has
> not been created yet.
>
> Secondly, I have a Spring "ApplicationListener", but in the
> onApplicationEvent(ApplicationEvent event) method,
> "ServletActionContext.getContext()" is null.  How is this traditionally
> accomplished?
>
> Thanks!
> Burton

Reply | Threaded
Open this post in threaded view
|

Re: How to put Spring object in Struts application scope on web startup?

Burton Rhodes
I have all of these settings in place, but your comments spurred the idea
to have a "BaseAction" class where I autowire my object
(MyApplicationSettings.java) and then extend all of my Actions from this
class.

Just for my info though... My original line of thinking was to be able to
access the object with the following:

Map application = (Map) ActionContext.getContext().get("application");
application.get("myApplicationSettings");
---or---
<s:property value="#application.myApplicatoinSettings" />

I just couldn't figure out a way to put the object in the struts
application scope within a listener during startup.  Does that make sense?

On Fri, Sep 29, 2017 at 11:50 AM, Adam Brin <[hidden email]>
wrote:

> it’s a mixture of things:
>
> * Struts.xml should be setup to know about spring:
>     <constant name="struts.objectFactory"
>         value="org.apache.struts2.spring.StrutsSpringObjectFactory" />
>     <constant name="struts.objectFactory.spring.autoWire.alwaysRespect"
> value="true" />
>     <constant name="struts.objectFactory.spring.autoWire" value="name" />
>
> * register the appropriate application listeners
>
> * add the @Scope variables  to controllers
>
> --
> _________________________________________________________
> Adam Brin
> Director of Technology, Digital Antiquity
> 480.965.1278
>
> > On Sep 29, 2017, at 9:03 AM, Burton Rhodes <[hidden email]>
> wrote:
> >
> > How do you put a Spring object into the Struts application scope Map on
> > startup of a web application?  I have 2 listeners that I thought would be
> > the usual suspects, but have not had success yet.
> >
> > I have a ServletContextListener class but on the
> > contextInitialized(ServletContextEvent event) method, my spring bean has
> > not been created yet.
> >
> > Secondly, I have a Spring "ApplicationListener", but in the
> > onApplicationEvent(ApplicationEvent event) method,
> > "ServletActionContext.getContext()" is null.  How is this traditionally
> > accomplished?
> >
> > Thanks!
> > Burton
>
>
Reply | Threaded
Open this post in threaded view
|

Re: How to put Spring object in Struts application scope on web startup?

Yasser Zamani
Hello Burton,

I tested following and seems works but I did not tested if objects are
equal by reference (you may get different objects e.g. when scope is
prototype):

```java
public class MYStrutsPrepareFilter implements Filter {


        public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain)
                        throws IOException, ServletException {

                ActionContext actionContext = ActionContext.getContext();
                if(null != actionContext) {
                        ValueStack stack = actionContext.getValueStack();
                        StrutsSpringObjectFactory objectFactory = (StrutsSpringObjectFactory)
actionContext.getInstance(ObjectFactory.class);
                        try {
                                stack.setValue("#application['MYSpringObject']",
objectFactory.buildBean("myBeanName",null));
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                }
                chain.doFilter(req, res);
        }
}
```

```xml
     <filter>
         <filter-name>struts2prepare</filter-name>
         <filter-class>...StrutsPrepareFilter</filter-class>
     </filter>
     <filter>
         <filter-name>MYStrutsPrepareFilter</filter-name>
         <filter-class>MYStrutsPrepareFilter</filter-class>
     </filter>
     <filter>
         <filter-name>struts2execute</filter-name>
         <filter-class>...StrutsExecuteFilter</filter-class>
     </filter>
     <filter-mapping>
         <filter-name>struts2prepare</filter-name>
         <url-pattern>/*</url-pattern>
     </filter-mapping>
     <filter-mapping>
         <filter-name>MYStrutsPrepareFilter</filter-name>
         <url-pattern>/*</url-pattern>
     </filter-mapping>
     <filter-mapping>
         <filter-name>struts2execute</filter-name>
         <url-pattern>/*</url-pattern>
     </filter-mapping>
```

```jsp
<s:property value="#application.MYSpringObject.myProperty" />
```

Hope this helps!
Yasser.

On 9/30/2017 1:29 AM, Burton Rhodes wrote:

> I have all of these settings in place, but your comments spurred the idea
> to have a "BaseAction" class where I autowire my object
> (MyApplicationSettings.java) and then extend all of my Actions from this
> class.
>
> Just for my info though... My original line of thinking was to be able to
> access the object with the following:
>
> Map application = (Map) ActionContext.getContext().get("application");
> application.get("myApplicationSettings");
> ---or---
> <s:property value="#application.myApplicatoinSettings" />
>
> I just couldn't figure out a way to put the object in the struts
> application scope within a listener during startup.  Does that make sense?
>
> On Fri, Sep 29, 2017 at 11:50 AM, Adam Brin <[hidden email]>
> wrote:
>
>> it’s a mixture of things:
>>
>> * Struts.xml should be setup to know about spring:
>>      <constant name="struts.objectFactory"
>>          value="org.apache.struts2.spring.StrutsSpringObjectFactory" />
>>      <constant name="struts.objectFactory.spring.autoWire.alwaysRespect"
>> value="true" />
>>      <constant name="struts.objectFactory.spring.autoWire" value="name" />
>>
>> * register the appropriate application listeners
>>
>> * add the @Scope variables  to controllers
>>
>> --
>> _________________________________________________________
>> Adam Brin
>> Director of Technology, Digital Antiquity
>> 480.965.1278
>>
>>> On Sep 29, 2017, at 9:03 AM, Burton Rhodes <[hidden email]>
>> wrote:
>>>
>>> How do you put a Spring object into the Struts application scope Map on
>>> startup of a web application?  I have 2 listeners that I thought would be
>>> the usual suspects, but have not had success yet.
>>>
>>> I have a ServletContextListener class but on the
>>> contextInitialized(ServletContextEvent event) method, my spring bean has
>>> not been created yet.
>>>
>>> Secondly, I have a Spring "ApplicationListener", but in the
>>> onApplicationEvent(ApplicationEvent event) method,
>>> "ServletActionContext.getContext()" is null.  How is this traditionally
>>> accomplished?
>>>
>>> Thanks!
>>> Burton
>>
>>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: How to put Spring object in Struts application scope on web startup?

Burton Rhodes
Nice - I'll take a closer look.  That seems like a decent solution


On Sat, Sep 30, 2017 at 4:22 AM, Yasser Zamani <[hidden email]>
wrote:

> Hello Burton,
>
> I tested following and seems works but I did not tested if objects are
> equal by reference (you may get different objects e.g. when scope is
> prototype):
>
> ```java
> public class MYStrutsPrepareFilter implements Filter {
>
>
>         public void doFilter(ServletRequest req, ServletResponse res,
> FilterChain chain)
>                         throws IOException, ServletException {
>
>                 ActionContext actionContext = ActionContext.getContext();
>                 if(null != actionContext) {
>                         ValueStack stack = actionContext.getValueStack();
>                         StrutsSpringObjectFactory objectFactory =
> (StrutsSpringObjectFactory)
> actionContext.getInstance(ObjectFactory.class);
>                         try {
>                                 stack.setValue("#application['
> MYSpringObject']",
> objectFactory.buildBean("myBeanName",null));
>                         } catch (Exception e) {
>                                 e.printStackTrace();
>                         }
>                 }
>                 chain.doFilter(req, res);
>         }
> }
> ```
>
> ```xml
>      <filter>
>          <filter-name>struts2prepare</filter-name>
>          <filter-class>...StrutsPrepareFilter</filter-class>
>      </filter>
>      <filter>
>          <filter-name>MYStrutsPrepareFilter</filter-name>
>          <filter-class>MYStrutsPrepareFilter</filter-class>
>      </filter>
>      <filter>
>          <filter-name>struts2execute</filter-name>
>          <filter-class>...StrutsExecuteFilter</filter-class>
>      </filter>
>      <filter-mapping>
>          <filter-name>struts2prepare</filter-name>
>          <url-pattern>/*</url-pattern>
>      </filter-mapping>
>      <filter-mapping>
>          <filter-name>MYStrutsPrepareFilter</filter-name>
>          <url-pattern>/*</url-pattern>
>      </filter-mapping>
>      <filter-mapping>
>          <filter-name>struts2execute</filter-name>
>          <url-pattern>/*</url-pattern>
>      </filter-mapping>
> ```
>
> ```jsp
> <s:property value="#application.MYSpringObject.myProperty" />
> ```
>
> Hope this helps!
> Yasser.
>
> On 9/30/2017 1:29 AM, Burton Rhodes wrote:
> > I have all of these settings in place, but your comments spurred the idea
> > to have a "BaseAction" class where I autowire my object
> > (MyApplicationSettings.java) and then extend all of my Actions from this
> > class.
> >
> > Just for my info though... My original line of thinking was to be able to
> > access the object with the following:
> >
> > Map application = (Map) ActionContext.getContext().get("application");
> > application.get("myApplicationSettings");
> > ---or---
> > <s:property value="#application.myApplicatoinSettings" />
> >
> > I just couldn't figure out a way to put the object in the struts
> > application scope within a listener during startup.  Does that make
> sense?
> >
> > On Fri, Sep 29, 2017 at 11:50 AM, Adam Brin <[hidden email]>
> > wrote:
> >
> >> it’s a mixture of things:
> >>
> >> * Struts.xml should be setup to know about spring:
> >>      <constant name="struts.objectFactory"
> >>          value="org.apache.struts2.spring.StrutsSpringObjectFactory" />
> >>      <constant name="struts.objectFactory.
> spring.autoWire.alwaysRespect"
> >> value="true" />
> >>      <constant name="struts.objectFactory.spring.autoWire"
> value="name" />
> >>
> >> * register the appropriate application listeners
> >>
> >> * add the @Scope variables  to controllers
> >>
> >> --
> >> _________________________________________________________
> >> Adam Brin
> >> Director of Technology, Digital Antiquity
> >> 480.965.1278
> >>
> >>> On Sep 29, 2017, at 9:03 AM, Burton Rhodes <[hidden email]>
> >> wrote:
> >>>
> >>> How do you put a Spring object into the Struts application scope Map on
> >>> startup of a web application?  I have 2 listeners that I thought would
> be
> >>> the usual suspects, but have not had success yet.
> >>>
> >>> I have a ServletContextListener class but on the
> >>> contextInitialized(ServletContextEvent event) method, my spring bean
> has
> >>> not been created yet.
> >>>
> >>> Secondly, I have a Spring "ApplicationListener", but in the
> >>> onApplicationEvent(ApplicationEvent event) method,
> >>> "ServletActionContext.getContext()" is null.  How is this
> traditionally
> >>> accomplished?
> >>>
> >>> Thanks!
> >>> Burton
> >>
> >>
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
Reply | Threaded
Open this post in threaded view
|

Re: How to put Spring object in Struts application scope on web startup?

Lukasz Lenart
Do you have any other idea how it's supposed to be solved? An
interface with a struts.xml entry to bridge Spring bean with a Struts
scope?


Regards
--
Łukasz
+ 48 606 323 122 http://www.lenart.org.pl/

2017-10-01 5:16 GMT+02:00 Burton Rhodes <[hidden email]>:

> Nice - I'll take a closer look.  That seems like a decent solution
>
>
> On Sat, Sep 30, 2017 at 4:22 AM, Yasser Zamani <[hidden email]>
> wrote:
>
>> Hello Burton,
>>
>> I tested following and seems works but I did not tested if objects are
>> equal by reference (you may get different objects e.g. when scope is
>> prototype):
>>
>> ```java
>> public class MYStrutsPrepareFilter implements Filter {
>>
>>
>>         public void doFilter(ServletRequest req, ServletResponse res,
>> FilterChain chain)
>>                         throws IOException, ServletException {
>>
>>                 ActionContext actionContext = ActionContext.getContext();
>>                 if(null != actionContext) {
>>                         ValueStack stack = actionContext.getValueStack();
>>                         StrutsSpringObjectFactory objectFactory =
>> (StrutsSpringObjectFactory)
>> actionContext.getInstance(ObjectFactory.class);
>>                         try {
>>                                 stack.setValue("#application['
>> MYSpringObject']",
>> objectFactory.buildBean("myBeanName",null));
>>                         } catch (Exception e) {
>>                                 e.printStackTrace();
>>                         }
>>                 }
>>                 chain.doFilter(req, res);
>>         }
>> }
>> ```
>>
>> ```xml
>>      <filter>
>>          <filter-name>struts2prepare</filter-name>
>>          <filter-class>...StrutsPrepareFilter</filter-class>
>>      </filter>
>>      <filter>
>>          <filter-name>MYStrutsPrepareFilter</filter-name>
>>          <filter-class>MYStrutsPrepareFilter</filter-class>
>>      </filter>
>>      <filter>
>>          <filter-name>struts2execute</filter-name>
>>          <filter-class>...StrutsExecuteFilter</filter-class>
>>      </filter>
>>      <filter-mapping>
>>          <filter-name>struts2prepare</filter-name>
>>          <url-pattern>/*</url-pattern>
>>      </filter-mapping>
>>      <filter-mapping>
>>          <filter-name>MYStrutsPrepareFilter</filter-name>
>>          <url-pattern>/*</url-pattern>
>>      </filter-mapping>
>>      <filter-mapping>
>>          <filter-name>struts2execute</filter-name>
>>          <url-pattern>/*</url-pattern>
>>      </filter-mapping>
>> ```
>>
>> ```jsp
>> <s:property value="#application.MYSpringObject.myProperty" />
>> ```
>>
>> Hope this helps!
>> Yasser.
>>
>> On 9/30/2017 1:29 AM, Burton Rhodes wrote:
>> > I have all of these settings in place, but your comments spurred the idea
>> > to have a "BaseAction" class where I autowire my object
>> > (MyApplicationSettings.java) and then extend all of my Actions from this
>> > class.
>> >
>> > Just for my info though... My original line of thinking was to be able to
>> > access the object with the following:
>> >
>> > Map application = (Map) ActionContext.getContext().get("application");
>> > application.get("myApplicationSettings");
>> > ---or---
>> > <s:property value="#application.myApplicatoinSettings" />
>> >
>> > I just couldn't figure out a way to put the object in the struts
>> > application scope within a listener during startup.  Does that make
>> sense?
>> >
>> > On Fri, Sep 29, 2017 at 11:50 AM, Adam Brin <[hidden email]>
>> > wrote:
>> >
>> >> it’s a mixture of things:
>> >>
>> >> * Struts.xml should be setup to know about spring:
>> >>      <constant name="struts.objectFactory"
>> >>          value="org.apache.struts2.spring.StrutsSpringObjectFactory" />
>> >>      <constant name="struts.objectFactory.
>> spring.autoWire.alwaysRespect"
>> >> value="true" />
>> >>      <constant name="struts.objectFactory.spring.autoWire"
>> value="name" />
>> >>
>> >> * register the appropriate application listeners
>> >>
>> >> * add the @Scope variables  to controllers
>> >>
>> >> --
>> >> _________________________________________________________
>> >> Adam Brin
>> >> Director of Technology, Digital Antiquity
>> >> 480.965.1278
>> >>
>> >>> On Sep 29, 2017, at 9:03 AM, Burton Rhodes <[hidden email]>
>> >> wrote:
>> >>>
>> >>> How do you put a Spring object into the Struts application scope Map on
>> >>> startup of a web application?  I have 2 listeners that I thought would
>> be
>> >>> the usual suspects, but have not had success yet.
>> >>>
>> >>> I have a ServletContextListener class but on the
>> >>> contextInitialized(ServletContextEvent event) method, my spring bean
>> has
>> >>> not been created yet.
>> >>>
>> >>> Secondly, I have a Spring "ApplicationListener", but in the
>> >>> onApplicationEvent(ApplicationEvent event) method,
>> >>> "ServletActionContext.getContext()" is null.  How is this
>> traditionally
>> >>> accomplished?
>> >>>
>> >>> Thanks!
>> >>> Burton
>> >>
>> >>
>> >
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [hidden email]
>> For additional commands, e-mail: [hidden email]
>>

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]