DAO注入的问题

ssssss 2009-12-30 03:43:56
有类

public class Test{
public static List getValue(){
return new Value().getValue();
}
}
public class Value{
IOneDAO oneDAO;
public List getValue(){
System.out.println("---get here---");
List list = oneDAO.findAll();
return list;
}
oneDAO getter and setter...
}


说明:对oneDAO.findAll()已经进行测试(而且是通过页面请求action,Action再调用oneDAO.findAll()),会得到数据。
就是说,配置文件(S2SH)没有问题,数据库也有数据,但是页面调用getValue()方法,却不能得到数据,或者说是为空的数据。
这里原因其实很简单,就是没能让容器初始化oneDAO,所以oneDAO.findAll();不能工作。请教各位,我该怎么解决这个问题——不像一般流程那样Action中有个Biz引用,Biz又有个DAO引用,这样在application中一级一级配下来,当action被请求时,就能一级一级初始化了
补充:
已经在application中配置oneDAO了,前面讲的测试中就有用到了。
...全文
228 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ssssss 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 tangyanbo1110 的回复:]
如果不在actoin中调用确实比较麻烦,需要手动从容器中取
WebApplicationContext ctx= WebApplicationContextUtils.getWebApplicationContext(application);
IOneDAO bdrd= (IOneDAO )ctx.getBean("oneDAO");
这种方法类似于获取jndi
[/Quote]

现在问题是页面是直接访问静态方法,没有经过spring容器,所有这个application就无处可拿了。
String[] locations = {"classpath:applicationContext.xml", "classpath:applicationContext-DAO.xml"};
ApplicationContext ctx = new ClassPathXmlApplicationContext(locations);
也无法完成,真是费解
风过无痕1110 2009-12-30
  • 打赏
  • 举报
回复
如果不在actoin中调用确实比较麻烦,需要手动从容器中取
WebApplicationContext ctx= WebApplicationContextUtils.getWebApplicationContext(application);
IOneDAO bdrd= (IOneDAO )ctx.getBean("oneDAO");
这种方法类似于获取jndi
ssssss 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 tangyanbo1110 的回复:]
首先要说明的一点是:spring的依赖注入机制必须要在配置文件中配置
在action中调用oneDAO.findAll()能成功的原因是:
oneDAO被初始化了,为什么呢?因为spring集成了struts2,意思就是说对action
进行了拦截,当检测到oneDAO在配置文件中有配置,就会给他初始化,
但在页面就不行了,或者说在任何其他没有在配置文件中配置的类中声明成员变量
oneDAO是不会被spring容器初始化的。
如果你一定要用,就必须得配置,那么请问,你在页面要怎么调用呢?
[/Quote]
页面可以直接调用静态方法的呀:

<s:iterator value="@com.util.Test@getValue()" status="stu" id="value">
<option><s:property value="value"/></option>
</s:iterator>

就能迭代取出啦!当然struts2.X的版本需要在struts.xml中配
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />
ssssss 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yinongstudio 的回复:]
Java codepublicclass Test{publicstatic List getValue(){returnnew Value().getValue();
}
}publicclass Value{
IOneDAO oneDAO;public List getValue(){
System.out.println("---get here---");
List list= oneDAO.findAll();return list;
}
oneDAO getter and setter...
}

你new Value()之后,没有给这个对象注入任何内容,到了List list = oneDAO.findAll();必然会报空指针。
如果是在jsp里,代码可以类似处理,估计你知道了如何获取WebApplicationContext ctx 应该就明白了。
Java code
Value v=new Value();
WebApplicationContext ctx= WebApplicationContextUtils.getWebApplicationContext(application);
IOneDAO bdrd= (IOneDAO )ctx.getBean("oneDAO");
v.setOneDAO();
[/Quote]

受教了!

我知道可以自己来初始化,TestCase就是自己来初始化配置文件的bean嘛,
当然我对如何获取WebApplicationContext ctx 的原理及应用还是处于初级阶段
看来还是这样解决比较好!
风过无痕1110 2009-12-30
  • 打赏
  • 举报
回复
首先要说明的一点是:spring的依赖注入机制必须要在配置文件中配置
在action中调用oneDAO.findAll()能成功的原因是:
oneDAO被初始化了,为什么呢?因为spring集成了struts2,意思就是说对action
进行了拦截,当检测到oneDAO在配置文件中有配置,就会给他初始化,
但在页面就不行了,或者说在任何其他没有在配置文件中配置的类中声明成员变量
oneDAO是不会被spring容器初始化的。
如果你一定要用,就必须得配置,那么请问,你在页面要怎么调用呢?
yinongstudio 2009-12-30
  • 打赏
  • 举报
回复

Value v = new Value();
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(application);
IOneDAO dao = (IOneDAO )ctx.getBean("oneDAO");
v.setOneDAO(dao);
List l = v.getValue();
yinongstudio 2009-12-30
  • 打赏
  • 举报
回复


public class Test{
public static List getValue(){
return new Value().getValue();
}
}
public class Value{
IOneDAO oneDAO;
public List getValue(){
System.out.println("---get here---");
List list = oneDAO.findAll();
return list;
}
oneDAO getter and setter...
}



你new Value()之后,没有给这个对象注入任何内容,到了List list = oneDAO.findAll();必然会报空指针。
如果是在jsp里,代码可以类似处理,估计你知道了如何获取WebApplicationContext ctx 应该就明白了。

Value v = new Value();
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(application);
IOneDAO bdrd = (IOneDAO )ctx.getBean("oneDAO");
v.setOneDAO();
ssssss 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 haobaofufob 的回复:]
最后一句代码有问题,应该是这样:
public class Test
{
  public static List getValue()
  {
    Value value = new Value();
    IOneDAO oneDAO = new IOneDAOImpl();//这里是IOneDAO的实现类
    value.setOneDAO(oneDAO);
    return value.getValue();
  }
}
[/Quote]
[Quote=引用 10 楼 dyflovexlp 的回复:]
new Value()时 oneDAO没有初始化....Value通过spring获得实例,不要new
[/Quote]

不知道页面直接调用static方法,这样通过spring获得实例行不行啊!
我去试试。。。
dyflovexlp 2009-12-30
  • 打赏
  • 举报
回复
new Value()时 oneDAO没有初始化....Value通过spring获得实例,不要new
haobaofufob 2009-12-30
  • 打赏
  • 举报
回复
最后一句代码有问题,应该是这样:
public class Test
{
public static List getValue()
{
Value value = new Value();
IOneDAO oneDAO = new IOneDAOImpl();//这里是IOneDAO的实现类
value.setOneDAO(oneDAO);
return value.getValue();
}
}
haobaofufob 2009-12-30
  • 打赏
  • 举报
回复
说实话,没看懂你要干啥
既然使用spring配置了动态注入,为啥还要new Value()呢? 使用new Value()的话Value类中的oneDao又没有初始化,List list = oneDAO.findAll();应该报一个空指针异常才对,不知道你是没有写异常还是你的程序没有错,如果非要new的话你可以这样写
public class Test
{
public static List getValue()
{
Value value = new Value();
IOneDAO oneDAO = new IOneDAOImpl();//这里是IOneDAO的实现类
value.setOneDAO(oneDAO);
return new Value().getValue();
}
}
Z8157522 2009-12-30
  • 打赏
  • 举报
回复
加了static之后,打印出get here只能说明调用方法没问题,oneDao是否能正常工作就不知道了.
我想的是和编译及对象实例化的先后有关.

不敢枉下结论,等待高手解答.
ssssss 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 nht1028 的回复:]
引用 3 楼 z8157522 的回复:
小菜飘过...感觉是Static的问题



我感觉也像呵呵
[/Quote]

第一,
后台也打印出
---get here---

第二,
经测试,如果不用oneDAO.findAll();来取值,而代之以手工填值进List(比如通过for循环填入),那么页面可以取得到值的!
当然,不知道各位所说static的问题究竟是不是指这方面的问题。
nht1028 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 z8157522 的回复:]
小菜飘过...感觉是Static的问题
[/Quote]


我感觉也像呵呵
Z8157522 2009-12-30
  • 打赏
  • 举报
回复
findAll已经工作了,说明配置应该正确吧
Z8157522 2009-12-30
  • 打赏
  • 举报
回复
小菜飘过...感觉是Static的问题
believefym 2009-12-30
  • 打赏
  • 举报
回复
oneDAO没在配置文件里配好?
ssssss 2009-12-30
  • 打赏
  • 举报
回复
而且后台也打印出
---get here---
了,所以大家就把注意力放在
当程序运行到Value的getValue()时,如何让容器去调用setOneDAO()来初始化oneDAO
上面!!!

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧