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]

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

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

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

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

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

UserDALImpl是实现UserDAL 接口的吧

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

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

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

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

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

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

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

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

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

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

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

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

    UserBusinessImpl userBusinessImpl = (UserManager)factory.getBean("UserBusinessImpl ");

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

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

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

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

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

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

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

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

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

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]

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

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

<?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">

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

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

在web.xml加入


org.springframework.web.context.ContextLoaderListener


要不你action没有交给spring托管

给你个例子看看吧

http://mrzhangtufu.iteye.com/blog/247131
http://www.diybl.com/course/3_program/java/javajs/20090522/167645.html
认真看看

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