Integração em aplicações Web: Struts + Spring + Hibernate

14 respostas
jbneto

Salve salve galera,

Estou precisando integrar Spring + Struts + Hibernate em um sistema Web na empresa onde trabalho atualmente. Mas não consigo encontrar um material explicativo, principalmente da integração entre Struts e Spring, pois entre Spring e Hibernate eu já desenrolei.!

Qualquer ajuda será bem vinda, grande abraço pessoal. E um ótimo final de semana para todos.! 8)

14 Respostas

von.juliano

Uma boa referência sobre essa integração é o livro Struts 2 in Action.

Blz? Flw! :thumbup:

B

Este tutorual pode te ajudar.

jbneto

Valewww pela ajuda galera…!
:smiley:

jbneto

Pessoal de início eu estou integrando Hibernate + Spring e só depois vou integrar com Struts… Mas mesmo assim eu não estou conseguindo, abaixo segue meu applicationContext.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:jee="http://www.springframework.org/schema/jee"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

	<!-- Declaração da Session Factory -->
	<bean id="sessionFactory" scope="singleton"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		
		<property name="annotatedClasses">
			<list>
				<value>br.com.srv.model.Celular</value>
			</list>
		</property>
		
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.show_sql">false</prop>
				<prop key="hibernate.format_sql">false</prop>
				<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.connection.pool_size">1</prop>
				<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
				<prop key="hibernate.connection.url">jdbc:mysql://localhost/rastrobr</prop>
				<prop key="hibernate.connection.username">root</prop>
				<prop key="hibernate.connection.password">1234</prop>
			</props>
		</property>	
	</bean>
			
	<!-- Permite a utilização da anotação @Transaction -->
	<tx:annotation-driven transaction-manager="transactionManager"/>
	
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"/>
	</bean>
	
	<!-- Declaração dos Objetos de Acesso a Dados -->
	<bean id="celularDAO" class="br.com.srv.dao.CelularDao">
		<property name="sessionFactory" ref="sessionFactory"/>
	</bean>

</beans>

E agora segue o meu web.xml:

<!-- Inicialização do Contexto do Spring -->
	<context-param>  
         <param-name>contextConfigLocation</param-name>  
         <param-value>  
             /WEB-INF/applicationContext.xml  
         </param-value>  
     </context-param>  
   
     <listener>  
         <listener-class>  
             org.springframework.web.context.ContextLoaderListener  
         </listener-class>  
     </listener>  
     
     <listener>  
         <listener-class>  
             org.springframework.web.context.request.RequestContextListener  
         </listener-class>  
     </listener>

E por último meu DAO:

public class CelularDao extends HibernateDaoSupport {


	@Transactional(readOnly=false)
	public void insertOrUpdate(Celular cel) {
	
		getHibernateTemplate().merge(cel);
	}
	
	@Transactional(readOnly=true)
	public Celular findById(Long id) {
		
		Celular celular = null;
		celular = (Celular) getHibernateTemplate().get(Celular.class, id);
		return celular;
	}
}

Quem faz a chamada do DAO é uma classe Service (CelularService.java)

Então é isso pessoal, espero que vocês possam me ajudar… já tô pra ficar doido e não consigo botar isso pra rodar.!
Forte Abraço.

bsl.lacerda

Se ainda não funcionou, tá aí o que você precisa.

http://cwiki.apache.org/S2WIKI/struts-2-spring-2-jpa-ajax.html

B

jbneto, qual é o seu problema?

jbneto
javax.servlet.ServletException: java.lang.Exception: Não foi possível encontrar os celulares
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:523)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
org.securityfilter.filter.SecurityFilter.doFilter(SecurityFilter.java:188)

Aparece esse erro aí no browser… obs.: Não estou, ainda integrando Struts + Spring, apenas Spring+Hibernate.

jbneto

Eu também tenho que declarar o Service que faz a chamada ao Dao no applicationContext.xml???

Eu queria mexer, por enquanto, apenas na camada de persistencia. Ou seja, deixar os Actions e Services de lado… e alterar apenas os DAOs para trabalhar com Spring e Hibernate. É possível?

B

Poste o stacktrace completo.

Se ele for um bean do Spring, sim.

E como você vai fazer pra chamar seu DAO?

jbneto

Cara, adicionei o service no applicationContext:

<bean id="celularService" class="br.com.srv.service.CelularService">
	<property name="celularDao" ref="celularDAO"/>
</bean>

E aqui está o service:

package br.com.srv.service;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.transaction.annotation.Transactional;

import br.com.srv.dao.CelularDao;
import br.com.srv.model.Celular;

@Transactional(readOnly=false)
public class CelularService {
	
	private CelularDao celularDao;
	
	public CelularDao getCelularDao() {
		return celularDao;
	}

	public void setCelularDao(CelularDao celularDao) {
		this.celularDao = celularDao;
	}

	public Celular findByCodVeiculo(Long codVeiculo) throws Exception{		
		Celular celular = null;
		try{
			ApplicationContext context = new ClassPathXmlApplicationContext("WEB-INF/applicationContext.xml");
			celularDao = (CelularDao) context.getBean("celularDAO");
						
			celular = celularDao.findById(codVeiculo);
			
		}catch (Exception e) {
			System.out.println(e);
			throw new Exception("Não foi possível encontrar os celulares");
		}
		return celular;
	}
}

Mas quando eu subo o tomcat ele vai carregar o applicationContext dá o seguinte erro no console:

INFO: Initializing Spring root WebApplicationContext
11/09/09 11:56 [main] ERROR org.springframework.web.context.ContextLoader:215 - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'celularService' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type [$Proxy11 implementing org.springframework.beans.factory.InitializingBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [br.com.srv.dao.CelularDao] for property 'celularDao'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy11 implementing org.springframework.beans.factory.InitializingBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [br.com.srv.dao.CelularDao] for property 'celularDao': no matching editors or conversion strategy found
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
	at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
	at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:830)
	at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:719)
	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:490)
	at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: org.springframework.beans.TypeMismatchException: Failed to convert property value of type [$Proxy11 implementing org.springframework.beans.factory.InitializingBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [br.com.srv.dao.CelularDao] for property 'celularDao'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy11 implementing org.springframework.beans.factory.InitializingBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [br.com.srv.dao.CelularDao] for property 'celularDao': no matching editors or conversion strategy found
	at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:391)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1289)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1250)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
	... 38 more
Caused by: java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy11 implementing org.springframework.beans.factory.InitializingBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [br.com.srv.dao.CelularDao] for property 'celularDao': no matching editors or conversion strategy found
	at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:231)
	at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:138)
	at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:386)
	... 42 more

Ele não está conseguindo criar o bean ‘celularService’, o que eu estou fazendo de errado??? :?

rubensdemelo

Fora dessa classe, vc consegue acessar o bean? (em uma classe de testes por exemplo)

Vc já debugou e viu o que chega nessa linha:

rubensdemelo

Se for usar o struts2, use o maven

mvn archetype:generate:3

O maven cria um projeto prontinho, com struts2 + hibernate + spring.

jbneto

Rubens, a aplicação naum tah nem rodando cara… esse erro explode no console quando eu starto o tomcat.!

E outra coisa, estou trabalhando em um sistema que já existe e é um pouco antigo, portanto, ele já trabalha com Struts 1… e a galera da empresa quer que eu ponha Hibernate e Spring.!

rubensdemelo

}catch (Exception e) { System.out.println(e); throw new Exception("Não foi possível encontrar os celulares"); }

Tira essa parte do código ou então coloque uma exceção mais específica e veja qual é a exceção.

Sem isso vai ser impossível saber qual é a exceção lançada, afinal vc está capturando a exceção-mãe.

Criado 3 de setembro de 2009
Ultima resposta 11 de set. de 2009
Respostas 14
Participantes 5