希望大神能够帮我解决这个问题在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().findByTrade(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各种方法(我实在是不想再自己写入其他代码,自动生成的代码应该可以用,只是我还没有实现)。
SpringStrutshibernate

解决方案 »

  1.   

    List<Notebook> pList=this.getNotebookDAO().findSerices("ThinkPad");<会报错>报什么错?空指针异常?
    你说的不大清楚,可能是我理解能力不行,问你下,你的意思是说:
    dao中同样的方法,通过spring在action中注入DAO对象调用就报错,但写个测试类,在测试类里获取spring创建的DAO对象再调用dao中的方法就不会报错。是这意思吗?
      

  2.   

    估计是 NotebookDAO 没有注入到 spring 
      

  3.   


    测试类还是在spring下布置的啊用的是同一个service。如果没有注入,测试类怎么成功。
      

  4.   

    那就很明显了,你通过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中
      

  5.   

    那就很明显了,你通过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中
    谢谢你耐心的解释。struts2 交由spring管理我知道。有两种方法。我用的就是你说的这种方法。还有一种是自动注入。这几天实在没办法我开始自己写条件查询语句了。问题解决了。不过还是很不爽。放着工具自带的代码不能用,自己写浪费我很大精力。
      

  6.   

    那就很明显了,你通过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中
    十分感谢大神啊。你说的第一条中了。我终于不用再自己写条件查询了。呵呵谢谢