Как интегрировать старое приложение Struts с Spring 3.x

#spring #struts #inversion-of-control #integration

#spring #struts #инверсия контроля #интеграция

Вопрос:

мне было интересно, как и какой предпочтительный способ интеграции приложения Struts 1.x с Spring 3.x, чтобы мы могли извлечь выгоду из материалов IOC.

Ответ №1:

Используйте ContextLoaderPlugin и установите для контроллера struts класс Processor «AutowiringRequestProcessor» следующим образом (в struts-config.xml ):

 <controller>
    <set-property property="processorClass" value="org.springframework.web.struts.AutowiringRequestProcessor" />
</controller>

<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation" value="/WEB-INF/config/action-servlet.xml"/>
</plug-in>
  

action-servlet.xml должен быть пустой файл контекста beans:

 <beans></beans>
  

Добавьте следующий параметр init в ActionServlet в web.xml:

 <init-param>
    <param-name>autowire</param-name>
    <param-value>byName</param-value>
</init-param>
  

Просто напишите обычные действия struts и добавьте аннотацию «@Component» к каждому действию, чтобы spring обнаружил действия и создал из них компонент. «AutowiringRequestProcessor» найдет правильный компонент, который соответствует классу action, определенному в вашем struts-config.xml .

Теперь также возможно внедрить другие компоненты в ваш класс действий с помощью @Autowired для установщиков.

Комментарии:

1. Не аннотируйте классы действий с помощью, @Component потому что AutowiringRequestProcessor не берет их экземпляры из BeanFactory Spring, он берет их из Struts, а затем вызывает autowireBeanProperties() метод для них. Таким образом, использование @Component приводит к наличию неиспользуемых компонентов в контексте Spring.

2. Это работает. Аннотации компонентов не нужны. Автоматически подключаемая работа только для свойств, не для полей: частная служба ITestService; общедоступный недействительный setService(@Autowired ITestService ts) { this.service = ts; }

Ответ №2:

Используйте ContextLoaderPlugIn. В Spring 3.0 оно устарело, но все еще существует.

Я использовал его со Struts 1.x и Spring 2.5.x — оно прекрасно работало. Такой подход к интеграции позволяет внедрять компоненты Spring beans непосредственно в действия Struts, что довольно просто.

Ответ №3:

Вы можете использовать интерфейс ApplicationContextAware, чтобы служебный класс имел доступ к ApplicationContext.

 public class SpringUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext = null;

    public static Object getSpringBean(String beanName) {
        return applicationContext.getBean(beanName);
    }

    public void setApplicationContext(ApplicationContext appContext)
        throws BeansException {
        applicationContext = appContext;
   }
}
  

Затем вы можете получить доступ к статическому методу из своего класса Action.

 public class MyAction extends LookupDispatchAction {
    private MyService getMyService() {
        return (MyService) SpringUtil.getSpringBean("myService");
    }
}
  

Не самое элегантное решение, но оно работает.

Ответ №4:

Это не работает. Подключаемый модуль ContextLoaderPlugin недоступен ни в одной версии Spring после Spring 2.x. Struts 1.x несовместим ни с одной версией Spring после 2.x. Невозможно настроить какую-либо версию Spring после 2.x для использования Struts 1.x. Вам либо потребуется понизить версию Spring для обновления Struts. Вероятно, было бы проще понизить версию Spring, если вы не используете версию гибернации после 3.x.

Комментарии:

1. Согласно другим ответам, это возможно .

2. Мы успешно использовали Spring 3.0 со Struts 1.2.

3. Все возможно ~ вам нужно иметь spring-2.x.x jar в classpath…