2

我遇到以下問題。我有一個應用程序與struts2,彈簧和struts2彈簧插件啓動和運行。通過Spring的依賴注入通常工作。 (例如,將一個bean注入到一個Action中)但是:我的Action-classes不會按照定義的每個會話的春季注入。 Actions構造函數被稱爲per requestuest。春天似乎不使用Spring的對象工廠。當在struts.xml中定義Action而不是使用@Action Annotations時,依賴注入將起作用!Struts2 Spring插件:帶註釋操作的依賴注入不起作用

這裏有一些片段:這裏我已經定義了一個bean和一個Action。注入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(); 
} 

在這裏,操作的執行:

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://本地主機/對myApp /患者」 使得操作-類的實例對每個請求,而不進入public PatientAction PatientAction()方法。

當我在支柱用這個,XML:

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

而且叫的 「http://本地主機/對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 

誰能告訴我我在做什麼毛病註解?

+0

我不確定這句話的含義「動作構造函數是每個reqiuest調用的」 – 2012-02-27 04:16:25

+0

每當客戶端(例如瀏覽器)發送一個請求時,就會創建一個動作的新實例。我不希望每次都有新的實例。我希望Spring IoC能夠在Web會話範圍中進行操作。 – Tarator 2012-03-02 16:05:55

+3

我不會建議你這樣做,因爲S2操作不僅適用於您的特定請求的中央處理,而且還可以作爲用於傳輸數據的模型,所以這就是爲什麼它們是在每個請求和它根據S2的體系結構,核心行爲的變化可能導致包括不一致結果在內的不良結果 – 2012-03-02 17:11:06

回答

1

爲struts.objectFactory的價值是不正確的,而不是 「春天」,它應該是 「org.apache.struts2.spring.StrutsSpringObjectFactory」

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

欲瞭解更多信息,請參見:http://struts.apache.org/2.3.1.2/docs/spring-plugin.html

請注意,每個請求都會實例化操作,因此將它們保留在會話中很可能會導致奇怪的事情發生,但沒有明顯的好處(配置文件)。