Problema relacionado a Transação usando Spring 3.0 e Hibernate 3.6

28/02/2012

0

ESTE É O MEU applicationContext.XML usando o SPRING 3.0 e Hibernate 3.6:

<!-- 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

Régis Santos

Responder

Posts

28/02/2012

Davi Costa

Qual import dessa anotação (@Transactional) vc está usando?

att Davi
Responder

28/02/2012

Robson Teixeira

Se a anotação @Transactional que está usando pertencer a um pacote do Spring teste somente nos métodos do seu SpringBean e não na classe.
att
robson
Responder

29/02/2012

Régis Santos

import org.springframework.beans.factory.annotation.Autowired;
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.
Responder

03/03/2012

Dyego Carmo

Poderia colar aqui o erro que esta aparecendo ?
Responder

04/03/2012

Régis Santos

clienteBean não consegue instanciar corretamente o objeto clienteService, como definido abaixo:

@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.

Responder

APRENDA A PROGRAMAR DO ZERO AO PROFISSIONAL

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar