首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

spring注入失败有关问题,再不搞定小弟我年都过不好了——不要让这100分荒废了

2012-02-09 
spring注入失败问题,再不搞定我年都过不好了——不要让这100分荒废了SSI框架研究了N久后,开始试着搭建简单的

spring注入失败问题,再不搞定我年都过不好了——不要让这100分荒废了
SSI框架研究了N久后,开始试着搭建简单的小功能,经历的什么找不到,那个不可以,这个定义不正确等等让人崩溃的异常后,终于是有个页面出来了,但我一点,你妹的有给了我个空指针异常!!!

折腾近两天了,发现该异常是由于spring依赖注入没有成功导致的,但看配置文件看了几百遍都没有看出错在哪里……
现贴出配置文件如下:
web.xml

XML code
<?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>


struts.xml
XML code
<?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>


applicationContext.xml
XML code
<?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> 



sqlMapConfig.xml
XML code
<?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>


User.java
Java code
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;    }}

==============================
最后贴上貌似用不上的UserDAO.java
Java code
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;            }}

经调试发现程序根本没走这个悲催的UserDAO

[解决办法]
报什么错误呀?
[解决办法]
你怎么又在 XML 文件中配置注入,又在用自动装配的扫描标签啊?
[解决办法]
你把请求路径改为/test/select;就是前面加上/test;
再测试是否有问题;
[解决办法]
啊 ,我明白了。你根本没给USER 实体的操作注入DAO,你只是给他做了一个事务代理的注入,所以没有找到DAO。

还有就是直接DAO本身就有事务单个操作的话,没有业务层干嘛使用 这个事务代理呢?

Java code
  <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的注入,所以为空。
[解决办法]

探讨
你把请求路径改为/test/select;就是前面加上/test;
再测试是否有问题;

[解决办法]
<bean id="userDAOProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property> 

这个应该是一个事务代理吧。

没有对单元DAO的组合,应该用不到这个事务代理。
[解决办法]
60行控制针,加个断点看看哪个对象是空的....
[解决办法]
探讨
引用:
你把请求路径改为/test/select;就是前面加上/test;
再测试是否有问题;

什么是请求路径??是action部分吗??刚接触这个不太懂这些术语
我的是这样的
<a href="<s:url action="/test/select"/>">点我看结果</a>

[解决办法]
引用
1. classpath:/applicationContext.xml和classpath:/sqlMapConfig.xml两个xml加载的对么?log4j配置一下日志打印出来看看。。。
2. strust配置加了namespace,那请求地址是否正确?
3. 注入的感觉没什么问题

然后看一下报错。。。发现你请求的url不对。。。
严重: Servlet.service() for servlet [default] in context with path [/FK_SSI] threw exception [java.lang.NullPointerException] with root cause

你用的/FK_SSI,应该要加上命名空间/test/FK_SSI.action

[解决办法]
直接给USER中注入 uesrDAO 就OK了。那个事务代理在你执行多种服务的时候在使用。比如有一种 同时执行两个数据新增操作的时候 就可以对那个组合后的业务BEAN 注入那个事务代理带达到控制多个单元造作的造成的事务问题。
[解决办法]
单个DAO的操作是用不到

Java code
  <!-- 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 code
<?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>
[解决办法]
探讨
引用:
单个DAO的操作是用不到


Java code


<!-- Struts2 action类 -->
<bean id="user" class="test.User" >
<property name="userdao">
<ref bean="userDAO"/>
</property>
</b……

汗,还是不行
我……

------解决方案--------------------


你写的怎么又有注解,又有配置文件,一个字乱。注解我好像也没看到要把那几个包做为spring要扫描的包啊。你的配置文件里面的userDao怎么用的是个接口类?
[解决办法]
annotation 

这个你配在哪里

热点排行