最近使用struts2+spring3+hibernate3.3做练习测试,引入jpa生成Dao,最后用Action调用dao的时候显示null,请朋友们帮忙啊代码如下:
applicationContext.xml:
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="sshPU" />
</bean>
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory"
ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" /><bean
id="BsTAssessUpdeventDAO"
class="com.tanyao.ibm.daoImp.BsTAssessUpdeventDAO">
<property name="entityManagerFactory"
ref="entityManagerFactory" />
</bean>
<bean id="BsTAssessEquipmentDAO"
class="com.tanyao.ibm.daoImp.BsTAssessEquipmentDAO">
<property name="entityManagerFactory"
ref="entityManagerFactory" />
</bean>
<bean id="BsTAssessJichengshangDAO"
class="com.tanyao.ibm.daoImp.BsTAssessJichengshangDAO">
<property name="entityManagerFactory"
ref="entityManagerFactory" />
</bean>
<bean id="BsTAssessActDAO"
class="com.tanyao.ibm.daoImp.BsTAssessActDAO">
<property name="entityManagerFactory"
ref="entityManagerFactory" />
</bean>
</beans>
Action:public class Demo2Action extends ActionSupport implements ServletRequestAware{
private BsTAssessActDAO bstassessactdao;
private IBsTAssessActDAO ibstassessactdao;
private BsTAssessAct bstassessact;

public String demo1()
{
bstassessact = bstassessactdao.findById("402880ee3122d803013122d92c80002d");
System.out.println(ibstassessactdao+"输出的内容是月份:"+bstassessact.getMonth());
return SUCCESS;
} public void setServletRequest(HttpServletRequest arg0) {
// TODO Auto-generated method stub

} /**
 * @return the bstassessactdao
 */
public BsTAssessActDAO getBstassessactdao() {
return bstassessactdao;
} /**
 * @param bstassessactdao the bstassessactdao to set
 */
public void setBstassessactdao(BsTAssessActDAO bstassessactdao) {
this.bstassessactdao = bstassessactdao;
} /**
 * @return the bstassessact
 */
public BsTAssessAct getBstassessact() {
return bstassessact;
} /**
 * @param bstassessact the bstassessact to set
 */
public void setBstassessact(BsTAssessAct bstassessact) {
this.bstassessact = bstassessact;
} /**
 * @return the ibstassessactdao
 */
public IBsTAssessActDAO getIbstassessactdao() {
return ibstassessactdao;
} /**
 * @param ibstassessactdao the ibstassessactdao to set
 */
public void setIbstassessactdao(IBsTAssessActDAO ibstassessactdao) {
this.ibstassessactdao = ibstassessactdao;
}
}调用dao的时候后台不报bug,前台jsp界面直接显示NullPointException,代码指向action的dao,我调试debug发现dao为空,请朋友们帮忙看看,如何实现spring注入hibernate,然后调用到的~

解决方案 »

  1.   

    dao没有实例化吧?按你说的,你dao中的方法也应该进不去,在你action中用if判断下dao是不是为空?然后输出日志看看
      

  2.   

    最好给dao的代码看看,继承hibernatedaosupport类了吗?配置 里我没看到就hibernateTimplte的注入! 
    例如:
    public class BaseDAOImpl<T> extends HibernateDaoSupport implements BaseDAO<T> {现在我倒认为你的配置文件有问题,有点乱,没仔细看,你再试试
      

  3.   

    action里面dao或者service注入了没
      

  4.   

    我也没看你上面这么多代码,太多了,
    大概出现这问题的原因
    1.你的配置和你在action对应的dao不一样,(很可能是你配置首写的是大写,在action却是小写),
    2.你在action没有有dao的get.set方法
    3.这是不可饶恕的,你的配置了问题。
    最后送你一句话:以后认真点。
      

  5.   

    各位我使用的是jpa的hibernate连接,在applicationContext.xml 不体现出来,生成persistence.xml文件中封装了数据库连接。
    类没有继承hibernateDaoSupport 而是JpaDaoSupport public class BsTAssessActDAO extends JpaDaoSupport implements IBsTAssessActDAO {}
    我只有action、model、dao、daoimpl目录,我现在想在action中掉用spring注入的dao文件,查询一条数据,现在显示dao为null,get/set方法已经生成了applicationContext。xml的配置为: <bean id="BsTAssessActDAO"
    class="com.tanyao.ibm.daoImp.BsTAssessActDAO">
    <property name="entityManagerFactory"
    ref="entityManagerFactory" />
    </bean>

    <bean id="demo2Action" class="com.tanyao.ibm.action.Demo2Action" >
    <property name="bstassessactdao" ref="BsTAssessActDAO" />
    </bean>Action调用代码为:private BsTAssessActDAO bstassessactdao;
    private BsTAssessAct bstassessact;
    public String demo1()(省略get,set方法,代码较多)
    {
         bstassessact = bstassessactdao.findById("402880ee3122d803013122d92c80002d");
         System.out.println("输出的内容是月份:"+bstassessact.getMonth());
         return SUCCESS;
    }
    是不是我少写代码了,spring注入的关键是什么,bean文件的id要和action中的dao名称一致吗?
      

  6.   

    各位我使用的是jpa的hibernate连接,在applicationContext.xml 不体现出来,生成persistence.xml文件中封装了数据库连接。
    类没有继承hibernateDaoSupport 而是JpaDaoSupport public class BsTAssessActDAO extends JpaDaoSupport implements IBsTAssessActDAO {}
    我只有action、model、dao、daoimpl目录,我现在想在action中掉用spring注入的dao文件,查询一条数据,现在显示dao为null,get/set方法已经生成了applicationContext。xml的配置为: <bean id="BsTAssessActDAO"
    class="com.tanyao.ibm.daoImp.BsTAssessActDAO">
    <property name="entityManagerFactory"
    ref="entityManagerFactory" />
    </bean>

    <bean id="demo2Action" class="com.tanyao.ibm.action.Demo2Action" >
    <property name="bstassessactdao" ref="BsTAssessActDAO" />
    </bean>Action调用代码为:private BsTAssessActDAO bstassessactdao;
    private BsTAssessAct bstassessact;
    public String demo1()(省略get,set方法,代码较多)
    {
         bstassessact = bstassessactdao.findById("402880ee3122d803013122d92c80002d");
         System.out.println("输出的内容是月份:"+bstassessact.getMonth());
         return SUCCESS;
    }
    是不是我少写代码了,spring注入的关键是什么,bean文件的id要和action中的dao名称一致吗?
      

  7.   

    bean文件的id要和action中的id要一样。具体原因就不多说了,
    观看你上面的你好像是用了2层。一个是表示层,一个是数据访问层,却没有业务逻辑层。
    给你点建议
    1.BsTAssessActDAO尽量全部是bsTAssessActDAO,别有时大写有时小写。
    2.命名规范。
    <bean id="BsTAssessActDAO" class="com.tanyao.ibm.daoImp.BsTAssessActDAO">
    上面是你写的,这是你的dao的实现层吗?如果是,类名这样BsTAssessActDAOImpl,
    3.逻辑清晰。既然你用了spring为什么你的配置是上面的这样我有点疑问,
      

  8.   

    解决了,我用的jpa配置的hibernate,生成的是application.xml,而不是单一的spring-config.xml,因为我用的是整合的ssh框架,最关键的一点是application.xml
    中bean的id和action中get,set的id要一模一样,百度上什么在applicationContext.xml中配置action,添加atuowire参数都扯淡的解决了,感谢各位……