spring注入失败问题,再不搞定我年都过不好了——不要让这100分荒废了
SSI框架研究了N久后,开始试着搭建简单的小功能,经历的什么找不到,那个不可以,这个定义不正确等等让人崩溃的异常后,终于是有个页面出来了,但我一点,你妹的有给了我个空指针异常!!!
折腾近两天了,发现该异常是由于spring依赖注入没有成功导致的,但看配置文件看了几百遍都没有看出错在哪里……
现贴出配置文件如下:
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- 配置Spring --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:/applicationContext.xml </param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <display-name>Struts Blank</display-name> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"><struts> <constant name="struts.objectTypeDeterminer" value="notiger" /> <constant name="struts.objectFactory" value="spring" /> <constant name="struts.objectFactory.spring.autoWire" value="name" /> <package name="test" namespace="/test" extends="struts-default"> <action name="select" class="test.User"> <result>/test/result.jsp</result> </action> <!-- <action name="insert" class="test.userDAO"> <result>/test/result.jsp</result> </action> --> </package> </struts>
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" /> <property name="username" value="system" /> <property name="password" value="+1101+" /> </bean> <!-- spring的ibatis 配制 --> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="classpath:/sqlMapConfig.xml" /> <property name="dataSource" ref="dataSource" /> </bean> <!-- spring 的事务处理类配置 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref local="dataSource" /> </property> </bean> <!-- 实体DAO类 --> <bean id="userDAO" class="test.UserDAO"> <property name="sqlMapClient"> <ref local="sqlMapClient" /> </property> </bean> <!-- Struts2 action类 --> <bean id="user" class="test.User" > <property name="userdao"> <ref bean="userDAOProxy"/> </property> </bean> <bean id="name" class="test.User"> <property name="name" value="张大三"/> </bean> <!-- 实体DAO类的代理类 --> <bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <property name="target"> <ref local="userDAO" /> </property> <property name="transactionAttributes"> <props> <prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="select*">PROPAGATION_REQUIRED</prop> <prop key="delete*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean></beans>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlMap namespace="test"> <resultMap id="User-result-list" class="test.User"> <result property="id" column="ID" /> <result property="name" column="name" /> <result property="sex" column="sex" /> </resultMap> <select id="selectUser" resultMap="User-result-list"> select id,name,sex from test </select></sqlMap>
package test;import java.util.List;import javax.servlet.http.HttpServletRequest;import com.opensymphony.xwork2.ActionSupport;import org.apache.struts2.ServletActionContext;import javax.annotation.Resource;@Resource(name="user")public class User extends ActionSupport { private String id; private String name; private String sex; @Resource private IuserDAO userdao; private List userList; //省略各种setter,getter方法…… public void setUserdao(IuserDAO userdao) { this.userdao = userdao; } public String execute() throws Exception { HttpServletRequest request = ServletActionContext.getRequest(); userList = userdao.selectUser(); request.setAttribute("userList",userList); return SUCCESS; }}package test;import java.util.List;import java.util.ArrayList;import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;public class UserDAO extends SqlMapClientDaoSupport implements IuserDAO{ public List selectUser() { try { List list = (List) getSqlMapClientTemplate().queryForList( "selectUser"); return list; } catch (Exception e) { e.printStackTrace(); } List list2=new ArrayList(); list2.add("aaa"); return list2; }}<bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <property name="target"> //应该不是在这里进行DAO的注入。应当提到UERS下。 <ref local="userDAO" /> </property> <property name="transactionAttributes"> <props> <prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="select*">PROPAGATION_REQUIRED</prop> <prop key="delete*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean>
[解决办法]
USER 中完全没有对DAO的注入,所以为空。
[解决办法]
<!-- Struts2 action类 --> <bean id="user" class="test.User" > <property name="userdao"> <ref bean="userDAO"/> </property> </bean><!-- 实体DAO类的代理类 --> <bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <property name="transactionAttributes"> <props> <prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="select*">PROPAGATION_REQUIRED</prop> <prop key="delete*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean></beans><bean id="USERBizProxy" parent="userDAOProxy"> <property name="target" ref="user"></property> </bean>
[解决办法]
是ibats的mapper对象没有被实例,也就是说UserDao没有被注入到你的User中,
你的 UserDAO 实现的接口为IuserDAO ,那么
1.将你的sqlMapConfig.xml 改为“IuserDAO.xml”
2.<sqlMap namespace="test">改为 <sqlMap namespace="test.IuserDAO">否则xml找不到对应的接口
[解决办法]
如果你是打算用自动扫描呢, 那你没有配置扫描路径和对DAO类的注解 ,如果是打算用配置文件注入呢 那就没有注入UserDao,看见你在applicationContext.xml配置了一个实体类DAO 你把bean的名称跟你在java文件中注入的实现类名称统一试试
[解决办法]
直接在user 中加入userDAO 不使用代理试试看
[解决办法]
DAO 中的方法只是对单个实体的增删改 查,所以我将其理解为单元操作。这种单个操作本身就有他们在自动事务,那个代理类,就是你注释所写的那个 DAO代理的BEAN那是一个事务代理,那个使用在 将单元操作组合的时候,比如你按 一个按钮的时候要同时对 A 类 和B 类 同时进行数据修改,这个时候就是一个单元的组合,如果没有事务控制,就有可能造成 A 变了 B没变 的情况,就好比银行转账吗。 所以我们要用到SPRING的事务代理来控制事务,如果A 或B 其中一个有一个修改是发生异常导致 单元操作事务回滚的时候,这个组合操作所绑定的另外一个类的 单元操作也会回滚, 然后就不会出现 一个改了另外一个没有改的问题。我这里有以前学习的时候做的例子的 XML 的配置文件你看看,应该就是这样了。
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!--数据源--> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"> </property> <property name="url" value="jdbc:sqlserver://localhost:1433"></property> <property name="username" value="sa"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="file:src/hibernate.cfg.xml"> </property> <property name="dataSource" ref="dataSource"></property> </bean> <!--DAO类单元操作--> <bean id="BankDAO" class="com.aminy.dao.impl.BankDAO"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <!--业务组合操作 何以进行多个DAO的注入 来实现复杂操作--> <bean id="zhuanzhangBiz" class="com.aminy.biz.impl.Zhuanzhang"> <property name="bankDAO" ref="BankDAO"></property> </bean> <!--事务管理类--> <bean id="tm" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!--事务代理工厂类--> <bean id="abstractProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> <property name="transactionManager" ref="tm"></property> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <!--具体业务的事务代理,使业务组合操作的事务收事务代理的控制--> <bean id="zhuanzhangBizProxy" parent="abstractProxy"> <property name="target" ref="zhuanzhangBiz"></property> </bean> </beans>
[解决办法]