2009-11-08 5 views
3

Nous étendons un ancien projet Struts 1 pour qu'il soit géré par Spring - mais nous souhaitons changer le code et le flux aussi peu que possible. Nous avons donc décidé de laisser Struts gérer les demandes et avons délégué les actions via la classe org.springframework.web.struts.DelegatingActionProxy.Intégration de ressort avec Struts 1 - injection de dépendances à ActionForm

Exemple:

Les struts-config.xml contient:

<action name="InvalidSession" 
     path="/pages/InvalidSession" 
    type="org.springframework.web.struts.DelegatingActionProxy" 
     scope="request"> 
    <forward name="success" path="/pages/Startup.do" /> 
</action> 

L'action-servlet.xml contient:

<bean name="/pages/InvalidSession" 
     class="com.xxx.actions.InvalidSessionAction" /> 

Maintenant épaissit l'intrigue:

Les haricots de printemps normaux ont été définis dans l'application licationContext.xml. Un exemple:

<bean id="parserUtils" class="com.xxx.el.parser.ParserUtils" > 
    <property name="parserFactory" ref="parserFactory"/> 
</bean> 

Je voudrais maintenant fil (pas automatiquement - mais ce n'est pas un problème), le haricot parserUtils à un ActionForm.

Si j'avais voulu câbler à une action Je définirais simplement le follwing dans l'action-servlet.xml:

<bean name="/pages/CaseUpdate" 
     class="com.xxx.actions.CaseUpdateAction" > 
    <property name="parserUtils" ref="parserUtils" /> 
</bean> 

où ce qui suit est dans le struts-config.xml:

<action path="/pages/CaseUpdate" 
     name="CaseUpdateForm" 
    type="org.springframework.web.struts.DelegatingActionProxy" 
     scope="request"> 
    <forward name="success" path="/pages/SwitchView.do" /> 
</action> 

Mais le Stuts-config contient également le ActionForm définition suivante:

<form-bean name="CaseUpdateForm" 
      type="com.xxx.forms.CaseUpdateForm" /> 

et je souhaite câbler le bean parserUtils à la classe CaseUpdateForm.

Que dois-je faire?

Merci à tous!

+0

ce qui suit ne m'a pas aidé, ou peut-être je l'ai mal compris: http: // stackoverflo w.com/questions/354171/struts-and-spring-together – Yaneeve

Répondre

0

Il semble que si je l'ai trouvé une solution:

Dans le fichier struts-config.xml J'ai changé:

<form-bean name="CaseUpdateForm" 
      type="com.xxx.forms.CaseUpdateForm" /> 

à:

<form-bean name="CaseUpdateForm" 
      type="org.springframework.web.struts.SpringBindingActionForm" /> 

J'ai ajouté la suivant dans le fichier action-servlet.xml:

<bean name="CaseUpdateForm" 
     class="com.xxx.forms.CaseUpdateForm" > 
    <property name="parserUtils" ref="parserUtils" /> 
</bean> 

Et:

<bean name="/pages/CaseUpdate" 
     class="com.xxx.actions.CaseUpdateAction" > 
    <property name="caseUpdateForm" ref="CaseUpdateForm" /> 
</bean> 

J'ai ajouté ce qui suit au fichier de classe CaseUpdateForm.java:

private ParserUtils parserUtils; 

public void setParserUtils(ParserUtils parserUtils) { 
    this.parserUtils = parserUtils; 
} 

Et ce qui suit au fichier de classe CaseUpdateAction.java:

private CaseUpdateForm caseUpdateForm; 

public void setCaseUpdateForm(CaseUpdateForm caseUpdateForm) { 
    this.caseUpdateForm = caseUpdateForm; 
} 

Enfin la méthode:

public ActionForward execute(ActionMapping mapping, 
        ActionForm form, 
       HttpServletRequest request, 
       HttpServletResponse response) 
       throws Exception 

obtenu les lignes de code ci-dessous inséré lui:

SpringBindingActionForm springBindingActionForm = (SpringBindingActionForm) form; 
ServletRequestDataBinder binder = 
    new ServletRequestDataBinder(caseUpdateForm, "CaseUpdateForm"); 

binder.bind(request); 
springBindingActionForm.expose(binder.getBindingResult(), request); 

Je devais aussi inclure le pot suivant dans le classpath:

printemps-webmvc.jar

C'est en raison de l'utilisation de la classe: ServletRequestDataBinder

0

Vous avez toujours la possibilité d'extraire par programme le bean parserFactory du contexte Spring.

Spring DispatcherServlet "publie" le contexte d'application de la servlet en tant qu'attribut de session. Vous pouvez récupérer le contexte de l'application à partir de là et obtenir manuellement votre parserFactory à partir de ce contexte.

Quelque chose pour vous lancer:

public Object getBean(ServletContext servletContext, String servletName, String beanName) { 
    String attrName = FrameworkServlet.SERVLET_CONTEXT_PREFIX + servletName; 
    BeanFactory beanFactory = (BeanFactory) servletContext.getAttribute(attrName); 
    return beanFactory.getBean(beanName); 
} 

Comme vous pouvez le voir, vous avez besoin d'un accès à l'objet ServletContext (que votre ActionForm devrait être en mesure d'obtenir l'aide getServlet().getServletContext()), ainsi que le nom du servlet Spring (comme défini dans web.xml), plus le nom du bean dans le contexte de l'application Spring que vous devez récupérer.

C'est plutôt moche, mais ça devrait marcher, si vous avez accès aux informations ci-dessus.

+0

J'essaye d'éviter tout ça et de configurer d'une manière ou d'une autre tout ceci "magiquement" :) – Yaneeve

+0

Rien de magique à propos de Struts. Puisque vos objets Struts ne sont pas gérés par Spring (seulement délégués), Spring n'a aucun mot à dire dans leur construction ou leur configuration. – skaffman