这个论坛有大神吗?

u010324685 2013-08-22 03:38:25
希望大神能够帮我解决这个问题

在struts(例如aAction) 用Myeclipse自动生成的DAO类(bDAO),
配置和注入没有问题。
1、但是在aAction中用bDAO类的findByXXX(属性就是数据库中列名)会报错,不过用bDAO里的findAll,save方法不会报错切得到正确的值。
例如:
public String execute() throws Exception {
// TODO Auto-generated method stub



String str=this.getBrandL();
List<Notebook> pList=this.getNotebookDAO().findSerices("ThinkPad");<会报错>
HttpServletResponse response = ServletActionContext.getResponse();
response.setCharacterEncoding("utf-8");
StringBuffer ddd=new StringBuffer();
for(Notebook no:pList){
ddd.append(no.getSeries());
ddd.append(",");
}
String arr=ddd.substring(0,ddd.length()-1);

response.getWriter().print(arr);
return null;
}

2、但是不在struts action类里,而新建一个主类测试(主类配置在spring中了DAO类当然也配置在spring中)不会出错。为了区别为试过两种方法都成功了{
1、不在spring中配置主类,用最原始的spring调用方法调试例如:


ApplicationContext ctx=new FileSystemXmlApplicationContext("WebRoot/WEB-INF/applicationContext.xml");
OtherTest con=ctx.getBean("otherTest", OtherTest.class);(原始调用)
接下来调用DAO类里各种方法都成功。
2、在spring中配置主类和DAO类。例如:
String str="ThinkPad";
List<Notebook> pList=this.getNotebookDAO().findByTrademark(str);
(spring配置和注入了主类和DAO类)
接下来调用DAO类里各种方法成功。
3、我尝试在DAO类(自动生成的用HibernateTemplate接口)自己写入HibernateCallBack用来实现各种findByXXX(属性,也就是列名),然后在上面的各种环境下使用均获得成功。
例如:
public boolean isExist(final String account) {//判断用户是否存在
List list = (List) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
List result = session.createCriteria(Consumer.class).add(Restrictions.eq("account", account)).list();
return result;
}
});
if(list.size()>0) {
return true;
} else {
return false;
}
}(这些系统没有自动生成)


4、我现在就是不明白为什么在各种情况下为什么结果不同;既然都是系统自动生成的为什么在struts action下有区别(是我配置有问题还是为什么)。既然系统都生成了DAO类而且在其他类里都可以使用为什么不能在struts2 里也用到findByXXX各种方法(我实在是不想再自己写入其他代码,自动生成的代码应该可以用,只是我还没有实现)。
...全文
236 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010324685 2013-08-30
  • 打赏
  • 举报
回复
引用 6 楼 zswiori 的回复:
[quote=引用 2 楼 u010324685 的回复:] 嗯是这个意思。
那就很明显了,你通过tomcat发布你的项目时,spring并没有成功的将dao对象注入到你的action中,但是你写测试类明确的告诉虚拟机你要从spring容器中获取你DAO对象,就没有错,这说明了你关于DAO注入的配置文件和代码都没有错。那问题只有一个了,就是你的action对象并不是通过spring创建的,而是struts2自己创建的。 这通常有两个地方配置错误会造成这种结果: 1:web.xml中你没有配置spring的监听,或者配置的spring的监听和struts2的配置顺序不对 2:在你struts2的配置文件里关于<action>的配置不正确: <action name="noteAction" class="com.test.action.NotebookAction"></action> 这是没使用的spring时的配置,当你使用了spring后,标红的地方不能写类名了,要改成你spring配置文件里那个<bean>的ID <action name="noteAction" class="noteActionInSpring"></action> 这样当你访问这个Action,struts2就不会自己创建Action,而是去spring容器中找有没有id为noteActionInSpring的已经创建好的action对象,只有当spring去创建action对象时,spring才能将DAO对象注入到action中[/quote] 十分感谢大神啊。你说的第一条中了。我终于不用再自己写条件查询了。呵呵谢谢。。。
u010324685 2013-08-30
  • 打赏
  • 举报
回复
引用 6 楼 zswiori 的回复:
[quote=引用 2 楼 u010324685 的回复:] 嗯是这个意思。
那就很明显了,你通过tomcat发布你的项目时,spring并没有成功的将dao对象注入到你的action中,但是你写测试类明确的告诉虚拟机你要从spring容器中获取你DAO对象,就没有错,这说明了你关于DAO注入的配置文件和代码都没有错。那问题只有一个了,就是你的action对象并不是通过spring创建的,而是struts2自己创建的。 这通常有两个地方配置错误会造成这种结果: 1:web.xml中你没有配置spring的监听,或者配置的spring的监听和struts2的配置顺序不对 2:在你struts2的配置文件里关于<action>的配置不正确: <action name="noteAction" class="com.test.action.NotebookAction"></action> 这是没使用的spring时的配置,当你使用了spring后,标红的地方不能写类名了,要改成你spring配置文件里那个<bean>的ID <action name="noteAction" class="noteActionInSpring"></action> 这样当你访问这个Action,struts2就不会自己创建Action,而是去spring容器中找有没有id为noteActionInSpring的已经创建好的action对象,只有当spring去创建action对象时,spring才能将DAO对象注入到action中[/quote] 谢谢你耐心的解释。struts2 交由spring管理我知道。有两种方法。我用的就是你说的这种方法。还有一种是自动注入。这几天实在没办法我开始自己写条件查询语句了。问题解决了。不过还是很不爽。放着工具自带的代码不能用,自己写浪费我很大精力。
zswiori 2013-08-27
  • 打赏
  • 举报
回复
引用 2 楼 u010324685 的回复:
嗯是这个意思。
那就很明显了,你通过tomcat发布你的项目时,spring并没有成功的将dao对象注入到你的action中,但是你写测试类明确的告诉虚拟机你要从spring容器中获取你DAO对象,就没有错,这说明了你关于DAO注入的配置文件和代码都没有错。那问题只有一个了,就是你的action对象并不是通过spring创建的,而是struts2自己创建的。 这通常有两个地方配置错误会造成这种结果: 1:web.xml中你没有配置spring的监听,或者配置的spring的监听和struts2的配置顺序不对 2:在你struts2的配置文件里关于<action>的配置不正确: <action name="noteAction" class="com.test.action.NotebookAction"></action> 这是没使用的spring时的配置,当你使用了spring后,标红的地方不能写类名了,要改成你spring配置文件里那个<bean>的ID <action name="noteAction" class="noteActionInSpring"></action> 这样当你访问这个Action,struts2就不会自己创建Action,而是去spring容器中找有没有id为noteActionInSpring的已经创建好的action对象,只有当spring去创建action对象时,spring才能将DAO对象注入到action中
u010324685 2013-08-24
  • 打赏
  • 举报
回复
谢谢... 真的很让我伤,没有一个人能够回答我的问题。 谢谢... 这是逼我只用条件查询啊。
u010324685 2013-08-23
  • 打赏
  • 举报
回复
引用 3 楼 a123822355 的回复:
估计是 NotebookDAO 没有注入到 spring
测试类还是在spring下布置的啊用的是同一个service。如果没有注入,测试类怎么成功。
施主别这样 2013-08-23
  • 打赏
  • 举报
回复
估计是 NotebookDAO 没有注入到 spring
u010324685 2013-08-23
  • 打赏
  • 举报
回复
引用 1 楼 zswiori 的回复:
List<Notebook> pList=this.getNotebookDAO().findSerices("ThinkPad");<会报错> 报什么错?空指针异常? 你说的不大清楚,可能是我理解能力不行,问你下,你的意思是说: dao中同样的方法,通过spring在action中注入DAO对象调用就报错,但写个测试类,在测试类里获取spring创建的DAO对象再调用dao中的方法就不会报错。是这意思吗?
嗯是这个意思。
zswiori 2013-08-23
  • 打赏
  • 举报
回复
List<Notebook> pList=this.getNotebookDAO().findSerices("ThinkPad");<会报错> 报什么错?空指针异常? 你说的不大清楚,可能是我理解能力不行,问你下,你的意思是说: dao中同样的方法,通过spring在action中注入DAO对象调用就报错,但写个测试类,在测试类里获取spring创建的DAO对象再调用dao中的方法就不会报错。是这意思吗?

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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