Я только начал работать со Spring Framework и пытался разработать и запустить простое приложение, используя Spring + Hibernate + Maven для управления зависимостями.
У меня есть ContactController, в котором свойство типа ContactService имеет значение Autowired.Но когда я упаковал его в war и развернул на tomcat, он генерирует исключение org.springframework.beans.factory.BeanCreationException со следующими сообщениями:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: An AnnotationConfiguration instance is required to use <mapping class="org.kodeplay.contact.form.Contact"/>
Поэтому я прокомментировал это свойство из класса ContactController вместе со всеми егоссылки и повторно его развернули.Но все равно это показывает ту же ошибку.
Это единственный контроллер во всем приложении, и объект, реализующий интерфейс ContactService, больше нигде не используется.
Что здесь происходит?Я что-то пропустил ?
Редактировать: Добавление кода для spring-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <context:annotation-config/> <context:component-scan base-package="org.kodeplay.contact" /> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> <!-- Internationalization --> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basename" value="classpath:messages" /> <property name="defaultEncoding" value="UTF-8" /> </bean> <!-- To load database connection details from jdbc.properties file --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" p:location="/WEB-INF/jdbc.properties" /> <!-- To establish a connection to the database --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" p:password="${jdbc.password}" /> <!-- Hibernate configuration --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="annotatedClasses"> <list> <value>org.kodeplay.contact.form.Contact</value> </list> </property> <property name="dataSource" ref="dataSource" /> <property name="configLocation"> <value>classpath:hibernate.cfg.xml</value> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${jdbc.dialect}</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> <tx:annotation-driven/> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> </beans>
Код для hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <mapping class="org.kodeplay.contact.form.Contact" /> </session-factory> </hibernate-configuration>
Спасибо
Я подозреваю, что это будет конфликт между AnnotationSessionFactoryBean и hibernate.cfg.xml. Если вы используете первое, вам не нужно второе. Если вы используете оба, вам придется дублировать некоторые настройки, и файл cfg может затмевать конфигурацию Spring.
AnnotationSessionFactoryBean
hibernate.cfg.xml
cfg
Все, что у вас есть в hibernate.cfg.xml, вы сможете перейти к определению bean-компонента для AnnotationSessionFactoryBean, и это должно устранить вашу ошибку.
Я полагаю, вы пытаетесь настроить Hibernate с org.springframework.orm.hibernate3.LocalSessionFactoryBean. Тем не менее, вы используете аннотации в отображении Hibernate, поэтому вам нужно использовать org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean.
org.springframework.orm.hibernate3.LocalSessionFactoryBean
org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean