linpyi 2009-12-04 16:22
浏览 472
已采纳

spring注入失败

最近想把以前的项目增加的service托给spring处理
[code="java"]


<bean id="userDao" class="com.*.dao.impl.UserDALImpl">
</bean>

[/code]

UserDALImpl是原先先好的DAO层的类,有自己的查询数据库的一些实现.我现在只想把userDao注入到service层里面处理

[code="java"]
UserBusinessImpl

private UserDAL userDAL;

public void setUserDAL(UserDAL userDAL) {
    this.userDAL = userDAL;
}

[/code]

感觉就是简单的注入,还是失败.
spring不熟,各位指点下.
[b]问题补充:[/b]
*号是我项目的 名称,我没写出来,其实是有路径的

UserDALImpl是实现UserDAL 接口

[b]问题补充:[/b]
没有报错信息.

只是在执行
[code="java"]
UserBusinessImpl.java

private UserDAL userDAL;

public void setUserDAL(UserDAL userDAL) {
    this.userDAL = userDAL;
}

public Person getUserFromEXTNO(String extNo) throws Exception {
    return userDAL.getUserFromEXTNO(extNo);
}

[/code]

[code="java"]
public class UserDALImpl extends BaseDAL implements UserDAL {
// 初始化Log
private Logger logger = Logger.getLogger(UserDALImpl.class);
public UserDALImpl() throws Exception {
}

public Person getUserFromEXTNO(String extNo) throws Exception {

执行SQL
}
[/code]
spring配置文件就这2个
[code="java"]
<?xml version="1.0" encoding="UTF-8"?>
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="userDao" class="com.ccsee.happytrip.dao.impl.UserDALImpl">
</bean>


[/code]

报的异常是在执行getUserFromEXTNO方法时候抛空指针,也就是注入失败,没把dao注入到service层中
[b]问题补充:[/b]
[code="java"]

UserDALImpl对象看看调用时是不是new的呢?? 如果是那就肯定错了 UserDALImpl 也得用spring注入 或者用applicationConexst.getbean取[/code]

UserDALImpl对象我是打算把他注入到UserBusinessImpl中去的,在UserBusinessImpl中是用set接口进去的

至于UserDALImpl本身有自己的JDBC连接池以及一系列的操作.
[b]问题补充:[/b]
[code="java"]
不对吧 你是已经从bean工程里取出来了 然后执行dao的方法时候报的错么? 如果取出来了 就证明你配置没错 。。。。。你把堆栈信息贴过来 我看看是在哪掉用的时候出的空指针
[/code]

配置文件的写法应该是对的,服务器启动正常,
但是没有注入成功.在执行到UserBusinessImpl的时候抛空指针,

[2009-12-04 17:08:18,125]-ERROR (UserLoginAction.java:93)|
java.lang.NullPointerException
at com.ccsee.happytrip.service.impl.UserBusinessImpl.getUserFromEXTNO(Us
erBusinessImpl.java:67)
[b]问题补充:[/b]
[code="java"]
UserBusinessImpl 如果不是通过spring get的 后面的照样无法注入成功 听我的试一下 我过去带的人就有这么错的 估计你的问题也是这个[/code]

没有明白你所说的spring get的
按我的理解就是,在action层,也使用同样的set注入.如果是这样的话,我有尝试过,但是是失败的,也是空指针,只不是报在action层了,也就是注入失败.

[b]问题补充:[/b]
[quote]
的确是没有获得到dao 你获得UserBusinessImpl 的方式应该不对吧 你是如何获得UserBusinessImpl 的? 那句代码贴出来看看
[/quote]
UserBusiness business = new UserBusinessImpl();
我是直接new的,我也尝试过像service层那样注入,一样没效果

[code="java"]
看你配置看不出有什么问题,有可能是DAO方法里某行报错了。
[/code]
应该还没到dao层,dao层的LOG都没打出来,应该就属于注入失败.
[b]问题补充:[/b]
[quote]
你new ClassPathXmlApplicationContext()的这个过程就是对配置文件的解析 以及按着你所配置的方式通过反射机制自动给你进行装配 如果没有这个过程 你直接new那就相当于在堆内存上开辟一个空的对象 里面没有任何的东西 所以你取出的dao是空 因为你没往里放东西啊,而UserBusinessImpl userBusinessImpl = (UserManager)factory.getBean("UserBusinessImpl ");是从已经放着解析并且装配好的所有对象的大容器里去取 所以你取出来的是装配好的啊
[/quote]
我把UserBusinessImpl改了下就可以了,
[code="java"]
public Person getUserFromEXTNO(String extNo) throws Exception {
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDAL userDal = (UserDAL)factory.getBean("userDao");
return userDal.getUserFromEXTNO(extNo);
}
[/code]
但是为什么使用set注入不行
[b]问题补充:[/b]
非常谢谢各位的解答

现在的结果是,我在action,service层使用getBean都可以获取到实例,但是使用set注入都是失败的.

[code="java"]





<bean id="userDao" class="com.ccsee.happytrip.dao.impl.UserDALImpl">
</bean>

[/code]

action层
[code="java"]
private UserBusiness userBusiness;

public void setUserBusiness(UserBusiness userBusiness) {
    this.userBusiness = userBusiness;
}

            Person user = userBusiness.getUserFromEXTNO(form.getUserName()
                    .trim());

[/code]

如果使用getBean就行,有朋友说必须都使用spring拖管就行了,我现在 action和service的都放在spring托管中,dao没办法托管必须用原来的.

我想问下原因,谢谢.
[b]问题补充:[/b]
我的struts有加载spring

strust-config.xml
[code="java"]



[/code]

  • 写回答

30条回答 默认 最新

  • wocsok 2009-12-04 18:10
    关注

    你误解了 我的这段代码 是然你写在action里 当执行UserBusiness business = new UserBusinessImpl(); 的时候 可以这么写
    BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");

    UserBusiness business = factory.getBean("userBusiness");

    这样当你再调用 business.getUserFromEXTNO(“”) 这个方法的时候 就不会报空指针了 因为business里的dao已经通过spring容易注入进来了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(29条)

报告相同问题?

悬赏问题

  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常
  • ¥15 关于风控系统,如何去选择