Hi All,

I managed to achieve what I wanted by using Struts 2 interceptor without
having Spring aoping the action class through dynamic proxy. Here is the
updated example.xml:

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd";>

<struts>

        <constant name="struts.objectFactory" value="spring" />
        
    <package name="example" namespace="/example" extends="struts-default">
    
        <interceptors>
            <interceptor name="timeLoggingInterceptor"
class="interceptor.TimeLoggingInterceptor"/>
        </interceptors>
        
        <default-interceptor-ref name="defaultStack"/>
       
        <action name="helloWorld" class="example.HelloWorld">
            <result>/example/HelloWorld.jsp</result>
        </action>
        
        <action name="Login_*" method="{1}" class="example.Login">
                <result name="input">/example/Login.jsp</result>
            <result type="redirect-action">Menu</result>
        </action>
                        
        <action name="Menu" class="Menu">
                <result>/example/Menu.jsp</result>
                <interceptor-ref name="defaultStack"/>
                <interceptor-ref name="timeLoggingInterceptor"/>
        </action>

        <action name="*" class="example.ExampleSupport">
            <result>/example/{1}.jsp</result>
        </action>

        <!-- Add actions here -->
    </package>
</struts>


An updated TimeLoggingInterceptor.java:

package interceptor;

import org.apache.log4j.Logger;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class TimeLoggingInterceptor extends AbstractInterceptor {

        protected final Logger logger = Logger.getLogger(getClass());

        public String intercept(ActionInvocation invocation) throws Exception {

                long startTime = System.currentTimeMillis();

                String result = invocation.invoke();

                long endTime = System.currentTimeMillis();

                logger.info("MenuAction: Time took = " + (endTime - startTime) 
+ " ms");

                return result;
        }
}

So, I think it is better to go through the framework interceptor (Struts 2)
to aop the action class instead of using Spring interceptor. For other
purpooses, we can use Spring interceptors.

Thanks http://www.nabble.com/file/7125/applicationContext.xml
applicationContext.xml ,
Lee


Shih Lee wrote:
> 
> 
> Hi All,
> 
> I think I know what is the trouble but am still not sure why is this a
> problem for Struts 2.0. I hope someone from the Struts community can help
> to
> shed some light.
> 
> The problem is when I use
> "org.springframework.aop.framework.ProxyFactoryBean" to AOP the Action
> class. Once I remove the AOP piece such as the following, everything work
> just fine:
> 
> <!--<bean id="Menu"
> class="org.springframework.aop.framework.ProxyFactoryBean">
>               <property name="proxyInterfaces">
>                       <value>example.IMenu</value>
>               </property>
>               <property name="interceptorNames">
>                       <list>
>                               <value>timeLoggingAdvisor</value>
>                       </list>
>               </property>
>               <property name="target">
>                       <ref local="MenuTarget"/>
>               </property>
>       </bean>
>       
>       <bean id="MenuTarget" class="example.Menu" singleton="false"/>-->
>       
>       <bean id="Menu" class="example.Menu" singleton="false"/>
> 
> Any help is appreciated!
> 
> Thanks,
> Lee
> 
> 
> Shih Lee wrote:
>> 
>>  Hi All,
>> 
>> I have been playing with Struts 2.0 sample application, struts-blank, and
>> integrates it with Spring 2.x. So far, I have not been having great
>> success
>> with it.
>> 
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> 
>> I have followed all the steps needed to integrate Struts 2.0 with Spring
>> 2.0.
>> Here is what I have done so far:
>> 
>> 1) Included struts2-spring-plugin-2.0.6.jar, spring.jar,
>> struts2-core-2.0.6.jar and the dependent jars.
>> 
>> 2) Modified the example.xml to include spring object factory:
>> 
>>    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts
>> Configuration 2.0//EN"
>>         "http://struts.apache.org/dtds/struts-2.0.dtd";>
>> 
>>    <struts>
>> 
>>       <constant name="struts.objectFactory" value="spring" />
>>       <package name="example" namespace="/example"
>> extends="struts-default">
>> 
>>       <default-interceptor-ref name="defaultStack"/>
>> 
>>         <action name="helloWorld" class="helloWorld">
>>             <result>/example/HelloWorld.jsp</result>
>>         </action>
>> 
>>         <action name="Login_*" method="{1}" class="example.Login">
>>             <result name="input">/example/Login.jsp</result>
>>             <result type="redirect-action">Menu</result>
>>         </action>
>> 
>>         <action name="Menu" class="Menu">
>>             <result>/example/Menu.jsp</result>
>>         </action>
>> 
>>         <action name="*" class="example.ExampleSupport">
>>             <result>/example/{1}.jsp</result>
>>         </action>
>> 
>>         <!-- Add actions here -->
>>     </package>
>> 
>> </struts>
>> 
>> 3) I have edited the spring applicationContext.xml
>> 
>>   <?xml version="1.0" encoding="UTF-8"?>
>> 
>>   <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
>> http://www.springframework.org/dtd/spring-beans.dtd";>
>> 
>>   <beans default-autowire="autodetect">
>> 
>>       <!-- =============================== Interceptors
>> ================================= -->
>> 
>>       <bean id="timeLoggingAdvice"
>> class="advice.TimeLoggingInterceptor"/>
>> 
>>       <!-- =============================== Advisor
>> ====================================== -->
>> 
>>       <bean id="timeLoggingAdvisor" class="
>> org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
>> 
>>             <property name="mappedNames">
>>                <list>
>>                   <value>execute</value>
>>                </list>
>>              </property>
>>             <property name="advice">
>>                   <ref bean="timeLoggingAdvice"/>
>>             </property>
>>       </bean>
>> 
>>       <!-- ============================== Spring Beans
>> ================================= -->
>> 
>>       <bean id="helloWorld" class="example.HelloWorld"
>> singleton="false"/>
>> 
>>       <bean id="Menu" class="
>> org.springframework.aop.framework.ProxyFactoryBean">
>> 
>>             <property name="proxyInterfaces">
>>                   <value>example.IMenu</value>
>>             </property>
>> 
>>            <property name="interceptorNames">
>>                   <list>
>>                         <value>timeLoggingAdvisor</value>
>>                   </list>
>>             </property>
>>             <property name="target">
>>                   <ref local="MenuTarget"/>
>>             </property>
>>       </bean>
>> 
>> 
>>       <bean id="MenuTarget" class="example.Menu" singleton="false"/>
>> </beans>
>> 
>> 4) Implemented ModelDriven, Preparable and SessionAware interfaces in
>> Menu.java:
>> 
>> package example;
>> import java.util.Map;
>> import org.apache.struts2.interceptor.SessionAware;
>> import com.opensymphony.xwork2.ModelDriven;
>> import com.opensymphony.xwork2.Preparable;
>> 
>> /**
>> 
>>  * <code>Set welcome message.</code>
>> 
>>  */
>> 
>> public class Menu extends ExampleSupport implements IMenu, ModelDriven,
>> Preparable, SessionAware {
>> 
>>             private Map _session;
>> 
>>             private User user;
>> 
>>     public String execute() throws Exception {
>> 
>>         return SUCCESS;
>> 
>>     }
>> 
>>             public Object getModel() {
>>                         return user;
>>             }
>> 
>>             public void prepare() throws Exception {
>>                         if (getSession().get("user") != null) {
>>                                     user = (User)
>> getSession().get("user");
>>                         } else {
>>                                     user = new User();
>>                         }
>>             }
>> 
>> 
>>             public void setSession(Map session) {
>>                         _session = session;
>>             }
>> 
>> 
>>             public Map getSession() {
>>                         return _session;
>>             }
>> }
>> 
>> When I let Spring manages the creation of objects, the methods for the
>> implemented interfaces such as getModel() and prepare() are not invoked.
>> If
>> I change the class="Menu" to class="example.Menu", the interfaces methods
>> were invoked since I am not letting spring manages object creation.
>> 
>> Could someone let me know what I may have done wrong? How can I use
>> Spring
>> and Struts at the same time without losing either functionality?
>> 
>> Any help is greatly appreciated.
>> 
>> Thanks!
>> 
>> Lee
>> 
>> 
> 
> -- 
> View this message in context:
> http://www.nabble.com/ModelDriven%2C-Preparable-and-SessionAware-do-not-work-with-Spring-tf3371304.html#a9381353
> Sent from the Struts - User mailing list archive at Nabble.com.
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/ModelDriven%2C-Preparable-and-SessionAware-do-not-work-with-Spring-tf3371304.html#a9447907
Sent from the Struts - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to