Problema relacionado a Transação usando Spring 3.0 e Hibernate 3.6
28/02/2012
0
<!-- Fonte de dados: driver e nome banco de dados, usuário, senha -->
<bean id=dataSource class=config.Conexao />
<!-- configuração do Hibernate -->
<bean id=sessionFactory class=org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean
scope=singleton lazy-init=false autowire=default>
<property name=dataSource ref=dataSource />
<property name=hibernateProperties>
<props>
<prop key=hibernate.dialect>org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key=hibernate.show_sql>true</prop>
<prop key=hibernate.hbm2ddl.auto>update</prop>
<prop key=hibernate.current_session_context_class></prop>
<prop key=c3p0.acquire_increment>1</prop>
<prop key=c3p0.idle_test_period>120</prop>
<prop key=c3p0.max_size>50</prop>
<prop key=c3p0.max_statements>100</prop>
<prop key=c3p0.min_size>5</prop>
<prop key=c3p0.timeout>150</prop>
</props>
</property>
<property name=annotatedClasses>
<!-- lista de classes sendo adicionados a serem manipuladas pelo Hibernate -->
<list>
<value>entidade.Cliente</value>
<value>entidade.Pais</value>
</list>
</property>
</bean>
<tx:annotation-driven transaction-manager=txManager proxy-target-class=false/>
<bean id=txManager class=org.springframework.orm.hibernate3.HibernateTransactionManager>
<property name=sessionFactory ref=sessionFactory/>
</bean>
<bean id=meuClienteDAO class=dao.ClienteDAO>
<property name=sessionFactory ref=sessionFactory/>
</bean>
<bean id=clienteService class=service.ClienteService>
<property name=clienteDAO ref=meuClienteDAO/>
</bean>
<!-- Possibilitando que se use anotação -->
<context:annotation-config/>
<!-- Habilitando que o Spring examine nos pacotes aqui definidos
por @Component, @Service, @Controller, Autowired -->
<context:component-scan base-package=dao, service, controle, relatorio />
public class ClienteBean implements Serializable {
@Autowired
private ClienteService clienteService;
public String incluir() {
moverDados();
clienteService.setCliente(cliente);
clienteService.inserir();
}
}
@Service(clienteService)
@Transactional(readOnly=false)
public class ClienteService implements IClienteService {
@Autowired
private ClienteDAO clienteDAO;
private Cliente cliente;
@Transactional(readOnly = false)
public void inserir() {
try{
clienteDAO.incluir(cliente);
} catch (Exception ex){
ex.printStackTrace();
} finally {
System.out.print(Deu certo!);
}
public ClienteDAO getClienteDAO() {
return clienteDAO;
}
public void setClienteDAO(ClienteDAO clienteDAO) {
this.clienteDAO = clienteDAO;
}
public Cliente getCliente() {
return cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
}
Problema Ocorrido:
Eu não consigo instanciar clienteService a partir da anotação @Autowired, definido aqui na classe ClienteBean. Este erro ocorre quando eu utilizo a anotação @Transactional na classe ClienteService.
@Autowired
private ClienteService clienteService;
Descrição do erro ao tentar abrir o clienteBean:
Error creating bean with name clienteBean: Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private service.ClienteService controle.ClienteBean.clienteService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [service.ClienteService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Mas se eu deixo apenas a anotação @Service(clienteService) sem usar a anotação @Transactional, o código funciona perfeitamente.
Acredito que o problema esteja relacionado com a Transação com o Hibernate. O spring está funcionando para todas as outras operações! E eu necessito muito usar Transações a partir do Hibernate.
Por favor, ajude-me em relação a este problema.
Régis.
Régis Santos
Posts
28/02/2012
Davi Costa
att Davi
28/02/2012
Robson Teixeira
att
robson
29/02/2012
Régis Santos
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import dao.ClienteDAO;
import entidade.Cliente;
Estes são os IMPORTS que eu uso na classe ClasseService implements IClienteService.
Quando eu coloco a anotação na classe: ClienteBean aparece um erro de PROXY.
Obrigado pela ajuda.
Régis.
04/03/2012
Régis Santos
@Autowired
private ClienteService clienteService;
A partir do Inspect os valores do objeto clienteService são mostrados a seguir:
- clienteService = service.ClienteService$$EnhancerByCGLIB$$64bcd4d0) service.ClienteService@1e1fd3
+ CGLIB$bound=true
+ CGLIB$CALLBACK_0 =org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor@d69502
+ CGLIB$CALLBACK_1 =org.springframework.aop.framework.Cglib2AopProxy$StaticUnadvisedInterceptor@d5f418
+ CGLIB$CALLBACK_2 =org.springframework.aop.framework.Cglib2AopProxy$SerializableNoOp@83bdcf
+ CGLIB$CALLBACK_3 =org.springframework.aop.framework.Cglib2AopProxy$StaticDispatcher@a79f01
+ CGLIB$CALLBACK_4 =org.springframework.aop.framework.Cglib2AopProxy$AdvisedDispatcher@bb1579
+ CGLIB$CALLBACK_5 = org.springframework.aop.framework.Cglib2AopProxy$EqualsInterceptor@2b8f23
+ CGLIB$CALLBACK_6 =org.springframework.aop.framework.Cglib2AopProxy$HashCodeInterceptor@1d25fea
+ cliente= null
+ clienteDAO = null <--------------------
Eu CONSIGO chamar o método (clienteService.inserir), mas como o (clienteDAO) não está instanciado o método (clienteDAO.incluir dentro do (clienteService)) não inclue nenhum <cliente>.
@Service(clienteService)
@Transactional(readOnly=false)
public class ClienteService implements IClienteService {
@Autowired
private ClienteDAO clienteDAO;
private Cliente cliente;
@Transactional(readOnly = false)
public void inserir() {
try{
clienteDAO.incluir(cliente);
} catch (Exception ex){
ex.printStackTrace();
} finally {
System.out.print(Deu certo graças a Deus!);
}
}
}
Este é o problema.
Régis.
Clique aqui para fazer login e interagir na Comunidade :)