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

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容易注入进来了

    点赞 评论
  • andilyliao 2009-12-04 16:27

    com.*.service.impl.UserBusinessImpl 那个*能不能写个别的呀 呵呵
    UserDALImpl实例化UserDAL了??

    点赞 评论
  • wanghaolovezlq 2009-12-04 16:28

    应该不至于,一定是你哪个地方搞出点问题,现在这样看是看不出什么问题

    UserDALImpl是实现UserDAL 接口的吧

    点赞 评论
  • wocsok 2009-12-04 16:36

    朋友 你把错误贴出来 帮你分析下。。现在看不来啊

    点赞 评论
  • wocsok 2009-12-04 16:38

    如果没报错 是不是你不是用spring的容器获得的实例啊。? 如果你自己new 就不能自动装配了

    点赞 评论
  • andilyliao 2009-12-04 16:39

    把代码贴全了吧 这点看不出问题来

    点赞 评论
  • Ryankay 2009-12-04 16:42

    应该是用new的多吧,,,把你源代码贴详细点。

    点赞 评论
  • andilyliao 2009-12-04 16:48

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

    点赞 评论
  • andilyliao 2009-12-04 16:54

    sorry 写错了 我想写的是UserBusinessImpl 呵呵

    点赞 评论
  • wanghaolovezlq 2009-12-04 16:58

    不会吧,我怀疑是调它个方法,这个方法本身报的异常

    点赞 评论
  • wocsok 2009-12-04 17:03

    不对吧 你是已经从bean工程里取出来了 然后执行dao的方法时候报的错么? 如果取出来了 就证明你配置没错 。。。。。你把堆栈信息贴过来 我看看是在哪掉用的时候出的空指针

    点赞 评论
  • andilyliao 2009-12-04 17:15

    UserBusinessImpl 如果不是通过spring get的 后面的照样无法注入成功 听我的试一下 我过去带的人就有这么错的 估计你的问题也是这个

    点赞 评论
  • wocsok 2009-12-04 17:24

    的确是没有获得到dao 你获得UserBusinessImpl 的方式应该不对吧 你是如何获得UserBusinessImpl 的? 那句代码贴出来看看

    点赞 评论
  • Ryankay 2009-12-04 17:27

    看你配置看不出有什么问题,有可能是DAO方法里某行报错了。

    点赞 评论
  • wocsok 2009-12-04 17:30

    给你个例子吧
    BeanFactory factory = new ClassPathXmlApplicationContext("这里配置的是你在classpath下的配置文件路径");

        UserBusinessImpl userBusinessImpl = (UserManager)factory.getBean("UserBusinessImpl ");
    
    点赞 评论
  • wocsok 2009-12-04 17:31

    这样才是从容器中取得配置好的实例那。。

    点赞 评论
  • wocsok 2009-12-04 17:32

    你在实验下 这回不会有问题了。。

    点赞 评论
  • wocsok 2009-12-04 17:36

    你new ClassPathXmlApplicationContext()的这个过程就是对配置文件的解析 以及按着你所配置的方式通过反射机制自动给你进行装配 如果没有这个过程 你直接new那就相当于在堆内存上开辟一个空的对象 里面没有任何的东西 所以你取出的dao是空 因为你没往里放东西啊,而UserBusinessImpl userBusinessImpl = (UserManager)factory.getBean("UserBusinessImpl ");是从已经放着解析并且装配好的所有对象的大容器里去取 所以你取出来的是装配好的啊

    点赞 评论
  • andilyliao 2009-12-04 17:47

    UserBusiness business = new UserBusinessImpl();
    肯定就不行了 如果用注入的话 它的上一层调用他必须也是spring的 建议用getbean

    点赞 评论
  • andilyliao 2009-12-04 17:55

    如果不使用getbean 你的servlet也得需要注入 所以用getbean就ok了 如果是new出来的就不是从spring里面抓出来的 那样肯定不会在UserBusinessImpl中注入dao
    因为UserBusinessImpl不是被spring管理的那个bean 而是你自己new出来的

    点赞 评论
  • 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容易注入进来了

    点赞 评论
  • wocsok 2009-12-04 18:15

    你可以写个action的公共父类 然后让所有action继承它 这样 你每次创建action的时候 就不用每次都BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml"); 了 让这个方法在父类里去做

    点赞 评论
  • xkuff 2009-12-04 21:03

    MyBean myBean = new MyBean();

    如果你想使用UserBusiness business = new UserBusinessImpl();的话,就不要把UserDAL注入到UserBusinessImpl类中,改成private UserDAL userDAL = (UserDAL)myBean.getBean("userDao");

    如果你要选择注入userDao,就不能UserBusiness business = new UserBusinessImpl();,要改成UserBusiness business = (UserBusiness)myBean.getBean("userBusiness");

    两者选其一。

    MyBean.java
    [code="java"]
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.FileSystemXmlApplicationContext;
    public class MyBean {
    private static ApplicationContext ctx;

    static {
        setCtx("/WebRoot/WEB-INF/");
    }
    
    public static void setCtx(String classpath) {
        if (ctx == null) {
            ctx = new FileSystemXmlApplicationContext(classpath + "applicationContext.xml");
        }
    }
    
    public ApplicationContext getCtx() {
        return ctx;
    }
    
    public Object getBean(String beanName) {
        return getCtx().getBean(beanName);
    }
    

    }
    [/code]

    点赞 评论
  • xkuff 2009-12-04 21:04

    setCtx("/WebRoot/WEB-INF/");
    要适当修改一下,只作参考。

    点赞 评论
  • andilyliao 2009-12-04 21:34

    我狂晕
    我是让你对UserBusinessImpl做getbean 不是在service里对dao做getbean UserBusinessImpl以后还需要扩展事务了 如果不被spring管理事务 spring用着就没意义了

    点赞 评论
  • rainer_piao 2009-12-04 21:37

    <?xml version="1.0" encoding="UTF-8"?>
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd">

    你用这个配置下看看可以不?

    点赞 评论
  • shwan521 2009-12-05 20:42

    他是执行dao的操作方法时候报错的。

    点赞 评论
  • wocsok 2009-12-07 08:59

    在web.xml加入


    org.springframework.web.context.ContextLoaderListener


    要不你action没有交给spring托管

    点赞 评论
  • wocsok 2009-12-07 09:16
    点赞 评论
  • wubo19842008 2009-12-07 16:29

    有可能是你的UserDAL userDAL声明的变量名问题,java有一套javabean的命名规范就是关于几个大写字母缩写的解释方式,貌似DAL这样的写法会set方法会解释成Dal,也许我记错了,以前哦我也碰见过。你把变量名改下试试,不要用大写字母缩写的方式。比如叫userService

    点赞 评论

相关推荐 更多相似问题