Integração Spring Annotations Com Vraptor, mentawai, struts 1

7 respostas
P

Pessoal, boa tarde.

É possivel usar spring annotations com vraptor, mentawai ou struts 1?

Com o struts 2 eu consegui, usando o struts2-spring-plugin.jar

Se possivel, me falem como.

Obrigado.

7 Respostas

andreiribas

Hoje em dia o Spring 2.5 já trabalha com anotações pra declarar recursos, servicos, repostitórios, não precisa usar o Spring Annotations.

É só dar uma olhada na documentação porque demorei um pouco pra aprender hehe.

P

cara, seguinte.

o spring annotations que falo não e o do urubatan.

e sim as annotations do proprio spring 2.5

agora eu nao sei como integra ele com o struts 1, com vraptor e mentawai.

entendes?

andreiribas

Hm ok.
Sorte tua que tenho um projetinho com spring e mentawai hehe.

Vou te passar os arquivos que importam:

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:p="http://www.springframework.org/schema/p" 
		xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:context="http://www.springframework.org/schema/context"
		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.5.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
			
		<!--
		Uses Apache Commons DBCP for connection pooling. See Commons DBCP documentation
		for the required JAR files. Alternatively you can use another connection pool
		such as C3P0, similarly configured using Spring.
	-->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
			p:driverClassName="org.gjt.mm.mysql.Driver" p:url="jdbc:mysql://localhost/testUser?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8" p:username="root"
			p:password="bancodedados"/>

	<!-- Hibernate SessionFactory -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
			p:dataSource-ref="dataSource">
			<property name="hibernateProperties">
			<props>
				<prop key="hibernate.mapping.precedence">class, hbm</prop>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.generate_statistics">true</prop>
			</props>
		</property>
			<property name="annotatedClasses">
				<list>
       				<value>testUser.model.User</value>
				</list>
			</property>
			
		
		<property name="eventListeners">
			<map>
				<entry key="merge">
					<bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>
				</entry>
			</map>
		</property>
	</bean>

	<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"
			p:sessionFactory-ref="sessionFactory"/>

	<context:component-scan base-package="testUser" />  
	<tx:annotation-driven/>


	<context:mbean-export/>
	
</beans>
ApplicationManager.java
/**
 * @author Andrei Gonçalves Ribas
 * 
 */
public class ApplicationManager extends org.mentawai.core.ApplicationManager {

	private BeanFactory beanFactory;
	
	public void init(Context application) {
				
		beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));

	}

	public void loadActions() {

		SpringActionConfig.setBeanFactory(beanFactory);

		filter(new InjectionFilter());

		spring("/User", "userAction");

	}
}

A Action com nome "userAction" será automaticamente injetada pelo Spring cada vez que chamar /User.

Exemplo de Action:
O detalhe está no qualifier "userAction", que o spring vai saber que á o que tá no applicationManager, sem precisar escrever um pra ele no applicationContext.

@Autowired é pra injetar o userService direto na action.
@Component
@Qualifier("userAction")
public class UserAction extends BaseAction {
	
	@Autowired
	private UserService userService;
		
	public String save() throws Exception {
        //qualquer coisa
        }
}
Classe DefualtUserService: @Service voce diz que é um servico, claro
@Service
public class DefaultUserService implements UserService {
	
	@Autowired
	private UsuarioDAO userDAO;
	
	@Transactional //se precisar escrever valores em uma transacao
	public boolean save(User u) {
		//metodo
	}
}
E por fim, usuarioDAO:
@Repository("usuarioDAO")
public class UsuarioDAO extends HibernateDaoSupport {

	@Autowired
	public UsuarioDAO(SessionFactory sf) {
		super.setSessionFactory(sf);
	}
        //outros metodos
}

Se não entender é só perguntar.

Te poupei uns dias de trabalho entendendo a documentação do spring.

P

andreiribas,

kara muito obrigado mesmo, pensei que não tivesse a possibilidade de integrar os dois.

tem como voce me enviar o projeto?

Obrigado.

andreiribas:
Hm ok. Sorte tua que tenho um projetinho com spring e mentawai hehe.

Vou te passar os arquivos que importam:

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:p="http://www.springframework.org/schema/p" 
		xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:context="http://www.springframework.org/schema/context"
		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.5.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
			
		<!--
		Uses Apache Commons DBCP for connection pooling. See Commons DBCP documentation
		for the required JAR files. Alternatively you can use another connection pool
		such as C3P0, similarly configured using Spring.
	-->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
			p:driverClassName="org.gjt.mm.mysql.Driver" p:url="jdbc:mysql://localhost/testUser?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8" p:username="root"
			p:password="bancodedados"/>

	<!-- Hibernate SessionFactory -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
			p:dataSource-ref="dataSource">
			<property name="hibernateProperties">
			<props>
				<prop key="hibernate.mapping.precedence">class, hbm</prop>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.generate_statistics">true</prop>
			</props>
		</property>
			<property name="annotatedClasses">
				<list>
       				<value>testUser.model.User</value>
				</list>
			</property>
			
		
		<property name="eventListeners">
			<map>
				<entry key="merge">
					<bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>
				</entry>
			</map>
		</property>
	</bean>

	<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"
			p:sessionFactory-ref="sessionFactory"/>

	<context:component-scan base-package="testUser" />  
	<tx:annotation-driven/>


	<context:mbean-export/>
	
</beans>
ApplicationManager.java
/**
 * @author Andrei Gonçalves Ribas
 * 
 */
public class ApplicationManager extends org.mentawai.core.ApplicationManager {

	private BeanFactory beanFactory;
	
	public void init(Context application) {
				
		beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));

	}

	public void loadActions() {

		SpringActionConfig.setBeanFactory(beanFactory);

		filter(new InjectionFilter());

		spring("/User", "userAction");

	}
}

A Action com nome "userAction" será automaticamente injetada pelo Spring cada vez que chamar /User.

Exemplo de Action:
O detalhe está no qualifier "userAction", que o spring vai saber que á o que tá no applicationManager, sem precisar escrever um pra ele no applicationContext.

@Autowired é pra injetar o userService direto na action.
@Component
@Qualifier("userAction")
public class UserAction extends BaseAction {
	
	@Autowired
	private UserService userService;
		
	public String save() throws Exception {
        //qualquer coisa
        }
}
Classe DefualtUserService: @Service voce diz que é um servico, claro
@Service
public class DefaultUserService implements UserService {
	
	@Autowired
	private UsuarioDAO userDAO;
	
	@Transactional //se precisar escrever valores em uma transacao
	public boolean save(User u) {
		//metodo
	}
}
E por fim, usuarioDAO:
@Repository("usuarioDAO")
public class UsuarioDAO extends HibernateDaoSupport {

	@Autowired
	public UsuarioDAO(SessionFactory sf) {
		super.setSessionFactory(sf);
	}
        //outros metodos
}

Se não entender é só perguntar.

Te poupei uns dias de trabalho entendendo a documentação do spring.

P

kara nao consegui fazer funcionar.

deu certo não :(

me envia o projeto

obrigado.

psb:
andreiribas,

kara muito obrigado mesmo, pensei que não tivesse a possibilidade de integrar os dois.

tem como voce me enviar o projeto?

Obrigado.

andreiribas:
Hm ok. Sorte tua que tenho um projetinho com spring e mentawai hehe.

Vou te passar os arquivos que importam:

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:p="http://www.springframework.org/schema/p" 
		xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:context="http://www.springframework.org/schema/context"
		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.5.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
			
		<!--
		Uses Apache Commons DBCP for connection pooling. See Commons DBCP documentation
		for the required JAR files. Alternatively you can use another connection pool
		such as C3P0, similarly configured using Spring.
	-->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
			p:driverClassName="org.gjt.mm.mysql.Driver" p:url="jdbc:mysql://localhost/testUser?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8" p:username="root"
			p:password="bancodedados"/>

	<!-- Hibernate SessionFactory -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
			p:dataSource-ref="dataSource">
			<property name="hibernateProperties">
			<props>
				<prop key="hibernate.mapping.precedence">class, hbm</prop>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.generate_statistics">true</prop>
			</props>
		</property>
			<property name="annotatedClasses">
				<list>
       				<value>testUser.model.User</value>
				</list>
			</property>
			
		
		<property name="eventListeners">
			<map>
				<entry key="merge">
					<bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>
				</entry>
			</map>
		</property>
	</bean>

	<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"
			p:sessionFactory-ref="sessionFactory"/>

	<context:component-scan base-package="testUser" />  
	<tx:annotation-driven/>


	<context:mbean-export/>
	
</beans>
ApplicationManager.java
/**
 * @author Andrei Gonçalves Ribas
 * 
 */
public class ApplicationManager extends org.mentawai.core.ApplicationManager {

	private BeanFactory beanFactory;
	
	public void init(Context application) {
				
		beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));

	}

	public void loadActions() {

		SpringActionConfig.setBeanFactory(beanFactory);

		filter(new InjectionFilter());

		spring("/User", "userAction");

	}
}

A Action com nome "userAction" será automaticamente injetada pelo Spring cada vez que chamar /User.

Exemplo de Action:
O detalhe está no qualifier "userAction", que o spring vai saber que á o que tá no applicationManager, sem precisar escrever um pra ele no applicationContext.

@Autowired é pra injetar o userService direto na action.
@Component
@Qualifier("userAction")
public class UserAction extends BaseAction {
	
	@Autowired
	private UserService userService;
		
	public String save() throws Exception {
        //qualquer coisa
        }
}
Classe DefualtUserService: @Service voce diz que é um servico, claro
@Service
public class DefaultUserService implements UserService {
	
	@Autowired
	private UsuarioDAO userDAO;
	
	@Transactional //se precisar escrever valores em uma transacao
	public boolean save(User u) {
		//metodo
	}
}
E por fim, usuarioDAO:
@Repository("usuarioDAO")
public class UsuarioDAO extends HibernateDaoSupport {

	@Autowired
	public UsuarioDAO(SessionFactory sf) {
		super.setSessionFactory(sf);
	}
        //outros metodos
}

Se não entender é só perguntar.

Te poupei uns dias de trabalho entendendo a documentação do spring.

andreiribas

qual foi o erro?

Você tem que adicionar as bibliotecas do hibernate, do spring e do mentawai.

P

todas as bibliotecas foram adicionadas.

eu tenho que colocar o contextloader no web.xml?

carrega o contexto sem problemas.

o problema e que o objeto *Service não e injetado quando eu chamo a action

entendeu?

valeu…

andreiribas:
qual foi o erro?

Você tem que adicionar as bibliotecas do hibernate, do spring e do mentawai.

Criado 21 de agosto de 2008
Ultima resposta 22 de ago. de 2008
Respostas 7
Participantes 2