2014-01-06 5 views
1

Я хочу создать веб-приложение на основе struts2 и spring. Прежде всего, я тестировал, если @Autowired работает на struts2. Но это не так, dataSource имеет значение NULL. Я понятия не имею, как я могу это исправить. Пожалуйста, дайте мне информацию об этом.@autowired не работает на struts2 + spring

HelloWorld.java

package example; 
import java.sql.Connection; 
import org.apache.commons.dbcp.BasicDataSource; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 
import com.opensymphony.xwork2.ActionSupport; 
@Component 
public class HelloWorld extends ActionSupport { 
    @Autowired 
    private BasicDataSource dataSource; 
    public String execute() throws Exception { 
     Connection con = dataSource.getConnection(); 
     con.close(); 
     return SUCCESS; 
    } 
} 

applicationContext.xml

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="org.h2.Driver"/> 
    <property name="url" value="jdbc:h2:mem" /> 
    <property name="maxActive" value="10" /> 
    <property name="username" value="sa" /> 
    <property name="password" value="" /> 
</bean> 

<context:annotation-config /> 
<context:component-scan base-package="example" /> 

web.xml

<filter> 
    <filter-name>struts2</filter-name> 
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>struts2</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

struts.xml

<constant name="struts.enable.DynamicMethodInvocation" value="false" /> 
<constant name="struts.devMode" value="true" /> 

<package name="example" namespace="/example" extends="struts-default"> 
    <action name="HelloWorld" class="example.test.HelloWorld"> 
     <result>/example/HelloWorld.jsp</result> 
    </action> 
</package> 
+1

Единственный момент, когда целью '@ Autowired' может быть« null »является то, что Spring не управляет объектом. Посмотрите на интеграционный мост спринт-стойки. Прямо сейчас Struts создает объект, а не Spring. –

+0

Чтобы использовать 'DI', вам нужно сделать следующее: 1. создать правильные свойства JDBC; Класс 2.entity; 3. Зарегистрируйте этот объект или компонент в 'applicationContext.xml'. пожалуйста, проверьте! кажется, что вы не зарегистрировали их в 'xml', пожалуйста, сделайте регистрацию или используйте' package scan'. – Rugal

ответ

2

Чтобы @Autowired работы в приложении распорок вам нужно данная вещь:

Убедитесь, что у вас есть Struts2 и пружинный плагин в вашем пути к классам.

Поместите следующую строку в strtus.xml

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

Настройте Action classes в XML-файле весной

<bean id="editAction" class="org.apache.struts.edit.action.EditAction" > 

    <property name="editService" ref="editService" /> 

</bean> 

И дать идентификатор боба в struts.xml файл вместо того, чтобы дать класс действий

<action name="edit" class="editAction" method="input"> 
    <result name="input">/edit.jsp</result> 
</action> 

Для получения дополнительной информации c onsult http://struts.apache.org/release/2.2.x/docs/spring-and-struts-2.html и http://struts.apache.org/release/2.2.x/docs/spring-plugin.html

+0

большое спасибо. в соответствии с вашим андером я изменил свой код и добавил «setDataSource» в класс действия, наконец, мой код действительно работает. – user3163986

Смежные вопросы