Olá,
estou tentando desenvolver minha primeira aplicação com Spring + Spring MVC + Hibernate…
Estou apanhando aqui com essas duas exceptions citadas no título… Acho que as duas estão meio ‘interligadas’…
aí vai:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'grupoController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.noronha.myFinancesWeb.database.service.GrupoService com.noronha.myFinancesWeb.controller.GrupoController.grupoService; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.orm.hibernate3.LocalSessionFactoryBean] for bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]; nested exception is java.lang.ClassNotFoundException: org.springframework.orm.hibernate3.LocalSessionFactoryBean
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
Vamos ao que eu fiz:
1- Criei o hibernate.cfg.xml na pasta scr
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost/myfinancesweb</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<!-- thread is the short name for org.hibernate.context.ThreadLocalSessionContext
and let Hibernate bind the session automatically to the thread -->
<property name="current_session_context_class">thread</property>
<!-- this will show us all sql statements -->
<property name="hibernate.show_sql">true</property>
<!-- this will create the database tables for us -->
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="com.noronha.myFinancesWeb.model.Categoria" />
<mapping class="com.noronha.myFinancesWeb.model.Conta" />
<mapping class="com.noronha.myFinancesWeb.model.Grupo" />
<mapping class="com.noronha.myFinancesWeb.model.Pagamento" />
</session-factory>
</hibernate-configuration>
Aqui está o meu 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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="com.noronha.myFinancesWeb" />
<mvc:resources location="/resources/" mapping="/resources/**"/>
<mvc:annotation-driven />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
Agora meu Controller onde quero injetar o service:
@Controller
@RequestMapping("/grupo/*")
public class GrupoController {
@Autowired
private GrupoService grupoService;
@RequestMapping("index")
public String index(){
return "redirect:grupo/search/1";
}
@RequestMapping("search/{page}")
public ModelAndView search(@PathVariable int page){
ModelAndView mv = new ModelAndView("grupo/search");
mv.addObject(page);
mv.addObject("itens",grupoService.listar(new Grupo(), page));
return mv;
}
O meu service:
@Service
public class GrupoService extends BaseService<Grupo, Integer>{
public GrupoService(BaseDao<Grupo, Integer> baseDao) {
super(baseDao);
}
}
O meu GrupoDao:
@Component
public class GrupoDao extends BaseDao<Grupo, Integer>{
@Autowired
SessionFactory sessionFactory;
public GrupoDao(SessionFactory sessionFactory) {
super(Grupo.class, sessionFactory);
}
@Override
protected Criteria setup(Grupo entity) {
Criteria criteria = super.getSession().createCriteria(entity.getClass());
if (entity.getId() != 0) {
criteria.add(Restrictions.eq("id", entity.getId()));
}
if (StringUtil.nulaOuVazia(entity.getDescricao())) {
criteria.add(Restrictions.like("descricao", entity.getDescricao(), MatchMode.ANYWHERE));
}
return criteria;
}
}
bom, acho que as classes genéricas /abstratas não precisam ser mostradas, mas se precisar é só falar que eu colo aqui.
Será que eu esqueci de algo? Alguma configuração?
Ahh, aproveitando o gancho, qual a diferença do @Component do VRaptor para o do Spring?
Abraços