2

我有以下问题。我有一个带有 struts2、spring 和 struts2-spring-plugin 的应用程序启动并运行。通过 Spring 的依赖注入通常可以正常工作。(例如。将 bean 注入到动作中)但是:我的动作类不是按照定义的每个会话通过 spring 注入的。按要求调用 Actions 构造函数。似乎 spring 不使用 Spring 的对象工厂。在 struts.xml 中定义 Action 而不是使用 @Action Annotations 时,依赖注入有效!

这里有一些片段: 这里我定义了一个 bean 和一个动作。注入 bean 是有效的,但是在使用 @Action 注释时,这里永远不会创建 Action。

@Bean
@Scope(value="session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public PatientForm PatientForm(){
    System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>> PatientForm() ");
    return new PatientForm();
}

@Bean(name="patient")
@Scope(value="request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public PatientAction PatientAction(){
    System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>> PatientAction() ");
    return new PatientAction();
}

这里执行Action:

   public class PatientAction extends TherapyActionSupport {
        private static final Logger logger = LoggerFactory.getLogger(PatientAction.class);

        @Autowired
        private PatientForm form;

        public PatientAction(){
            logger.debug("Constructor called.");
        }

        @Override
        @Action( name="/patient",
         results={ 
          @Result(name=SUCCESS, location="/therapy/patient/edit.jsp"),
          @Result(name=ERROR, location="/therapy/patient/edit.jsp"),
          @Result(name=INPUT, location="/therapy/patient/edit.jsp")
          }
        )
        @SkipValidation
        public String execute() throws Exception {
            logger.info("Execute called.");
            return SUCCESS;
        }

        @Action(value="/save",
         results={ 
           @Result(name=SUCCESS, location="/therapy/patient/list.jsp"),
           @Result(name=ERROR, location="/therapy/patient/edit.jsp"),
           @Result(name=INPUT, location="/therapy/patient/edit.jsp")
           }
        )
        public String savePatient() throws Exception{
            try {
                logger.info("Saving patient.");
                getForm().savePatient();
                return list();
            } catch (Exception e) {
                e.printStackTrace();
                return ERROR;
            }
        }
    }

调用 URL“http://localhost/myApp/patient”会在每个请求上创建一个 Action-Class 实例,而无需输入public PatientAction PatientAction()方法。

当我在struts中使用它时,xml:

<package name="default" extends="struts-default">
    <action name="foo" class="patient">
        <result>list.jsp</result>
    </action>
</package>

并调用“http://localhost/myApp/foo”该动作是通过弹簧注入的。

这是我的 struts.properties 文件:

struts.i18n.encoding=UTF-8
struts.objectFactory = spring
## Tried settings with autoWire
#struts.objectFactory.spring.autoWire = auto
struts.objectFactory.spring.autoWire = type

我使用的版本(通过 Maven :)

struts2-core 2.2.3.1
spring3 3.1.1.RELEASE
struts2-spring-plugin 2.3.1.2

谁能告诉我我在注释上做错了什么?

4

1 回答 1

1

struts.objectFactory 的值不正确,应该是“org.apache.struts2.spring.StrutsSpringObjectFactory”而不是“spring”

<struts>
  <constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" /> 
  ... 
</struts>

更多信息参见:http ://struts.apache.org/2.3.1.2/docs/spring-plugin.html

请注意,每个请求都会实例化操作,因此将它们保持在会话中很可能会导致奇怪的事情发生而没有明显的好处(分析它)。

于 2012-04-12T22:03:55.273 回答