One quick thing I see wrong is you have singleton="false" that is a spring 1 attribute.

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




Reply via email to