我正在以下网站上尝试示例应用程序:
JSF 2, PrimeFaces 3, Spring 3 & Hibernate 4 Integration Project
但我发现在运行项目时,我得到了:
SEVERE:将上下文初始化事件发送到类org.springframework.web.context.ContextLoaderListener的侦听器实例的异常 org.springframework.beans.factory.BeanCreationException:在ServletContext资源[/WEB-INF/applicationContext.xml]中定义名称为'UserService'的bean时出错:在设置bean属性'userDAO'时无法解析对'UserDAO'的引用;嵌套异常是org.springframework.beans.factory.BeanCreationException:在ServletContext资源中定义名为'UserDAO'的bean时出错[/WEB-INF/applicationContext.xml]
但是,在applicationContext.xml文件中,相关代码如下:
<!-- Beans Declaration -->
<bean id="User" class="com.otv.model.User"/>
<!-- User Service Declaration -->
<bean id="UserService" class="com.otv.user.service.UserService">
<property name="userDAO" ref="UserDAO" />
</bean>
<!-- User DAO Declaration -->
<bean id="UserDAO" class="com.otv.user.dao.UserDAO">
<property name="sessionFactory" ref="SessionFactory" />
</bean>
<!-- Session Factory Declaration -->
<bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="DataSource" />
<property name="annotatedClasses">
<list>
<value>com.otv.model.User</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
这些类确实存在于相关的包中,并且可以在下面看到各种配置文件的位置。
我可以在教程和我的实现之间看到的唯一区别是我使用的是NetBeans 7.2而不是Eclipse。
有没有人知道为什么会这样?
答案 0 :(得分:0)
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'UserService' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'UserDAO' while setting bean property 'userDAO';
这告诉您无法创建UserService,因为它缺少属性定义
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'UserDAO' defined in ServletContext resource [/WEB-INF/applicationContext.xml]
这告诉您无法找到UserDAO的定义。
你缺少UserDao定义,ref只是意味着它应该属于那种类型,它仍然需要一个bean定义。
基本上,每当你使用“ref”时,你都会告诉spring制作这种类型的属性。该类型需要在其自己的bean定义中定义。
因此,如果UserDao使用了另一个由“ref”定义的属性,那么该属性也需要自己的bean定义。
您必须将类和弹簧定义视为两个完全独立的实体。类可能在那里并放在它们应该的位置,但是spring需要它的bean定义才能调用它们。除非您明确告诉它要调用哪个包/类,否则它不知道UserDao或SessionFactory是什么。
答案 1 :(得分:0)
/WEB-INF/applicationContext.xml
应包含类似<bean id="UserDAO" class="com.otv.dao.UserDAO">...</bean>
的条目,其属性很大程度上取决于所使用的后端系统。
我还怀疑User
bean是一个错误的副本,过去的User
实例应该从DAO中重新获取或以编程方式创建。
至于为什么它在Eclipse中而不是在Netbeans中工作,实在是太奇怪了。一定有些杂乱......
答案 2 :(得分:0)
我找到了该错误的主要原因。它实际上很简单。
在课程com.otv.model.User
中,字段@Id
上方没有id
注释。
以下是答案的链接,引导我找出错误:hibernate exception: org.hibernate.AnnotationException: No identifier specified for entity: com..domain.idea.MAE_MFEView