<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="url"
value="jdbc:mysql://localhost:3306/studentnetworktest">
</property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>


<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/network/vo/News.hbm.xml</value>
</list>
</property>
</bean>
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>

<bean id="newsdao" class="com.network.dao.NewsDAO"
abstract="true">
</bean>

<bean id="newsdaoimpl" class="com.network.impl.NewsDAOImpl"
parent="newsdao" singleton="false">
<property name="hibernateTemplate">
<ref bean="hibernateTemplate" />
</property>
</bean>

<bean name="/news" class="com.network.struts.action.NewsAction"
singleton="true">
<property name="newsdao">
<ref bean="newsdaoimpl" />
</property>
</bean>
</beans>
这是applicationcontext启动tomcat后说是初始化最后/news的bean的时候 属性newsdao缺少get set方法  但是newsaction中分明写了getsetNewsDao(接口)的方法难道不能<ref bean="newsdaoimpl" />吗?  如果改为<ref bean="newsdao" />的话 也就是注入接口 提示说newsdao是个接口 不可以实例化

解决方案 »

  1.   


        <bean id="newsdao" class="com.network.dao.NewsDAO"
            abstract="true">
        </bean>
        
        <bean id="newsdaoimpl" class="com.network.impl.NewsDAOImpl"
            parent="newsdao" singleton="false">
            <property name="hibernateTemplate">
                <ref bean="hibernateTemplate" />
            </property>
        </bean>为什么newsdaoimpl这个bean要用parent="newsdao"?不需要吧..
    还有hibernateTemplate的注入,你在NewsDAOImpl里面是否有 getHibernateTemplate,setHibernateTemplate?
      

  2.   


        <!--id="newsdao" 为dao接口 
            class="com.network.dao.NewsDAO" 这个class应该是"newsdao"接口的实现类,
             但偶看你的名字不像,class="com.network.impl.NewsDAOImpl"比较像,
             里面要有property hibernateTemplate的声明
        -->
        <bean id="newsdao" class="com.network.impl.NewsDAOImpl">
           <property name="hibernateTemplate" ref="hibernateTemplate"/>感觉你这句格式可能有问题
        </bean>在newsdao里面要有hibernateTemplate的set
            
        <bean name="/news" class="com.network.struts.action.NewsAction" singleton="true">
            <property name="newsdao" ref="newsdao" />后一个newsdao引用上面的那个newsdao bean
        </bean> 在NewsAction里面要有newsdao的set
      

  3.   

    首先谢谢哥们~
    看了您的回复后我加了getsethibernatetemplate方法
    显示
    Cannot override the final method from HibernateDaoSupport
    具体调用的时候写的是Query q = this.getSession().createQuery(hql);
    可以直接用哈
      

  4.   

    哥们 我用的是HibernateDaoSupport 可以默认地注入hibernateTemplate
    第二个问题 action里面也有newsdao接口的setget方法  但是如果直接写newsdao(接口)的话 他会提示
    Error creating bean with name 'newsdao': Bean definition is abstract
    但是写newsdaoimpl(实际的DAO)的话 
    Invalid property 'newsdao' of bean class [com.network.struts.action.NewsAction]: Bean property 'newsdao' is not writable or has an invalid setter method: Does the parameter type of the setter match the return type of the getter?
    其中 newsdao是property的名字 ref是newsdaoimpl
      

  5.   


    <property name="newsdao" ref="newsdao" />
    ref="newsdao"是引用 bean id="newsdao" <bean id="newsdao" class="com.network.impl.NewsDAOImpl">
    name="newsdao"是对应NewsAction类里private NewsDAO newsdao;setNewsdao();