Problemas au utilizar a anotação @ Transactional [Resolvido]

1 resposta
F

Tenho uma pequena aplicação que utiliza spring + jpa + hibernate só que os dados não estão sendo salvos

o meu código é o seguinte:

Entity

package contatos.domain;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Contato implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	private String nome;

	public Contato() {
		super();
	}
	public Contato( String nome) {
		super();
		this.nome = nome;
	}
	public Long getId() {
		return id;
	}
	private void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
}

o a minha interface

package contatos.domain;


public interface IDAO {
	
	public void salvar(Contato contato);

}

a implementação:

package contatos.domain;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;

@Repository
public class ContatoDAO implements IDAO {
	
	@PersistenceContext
	private EntityManager entityManager;
	
	public void salvar(Contato contato) {
		entityManager.persist(contato);

	}
}

o meu serviço :

package contatos.domain;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


@Service 
public class ContatoService {
	
	
	private ContatoDAO contatoDAO;
	
	@Autowired
	public  void setContatoDAO(ContatoDAO dao){
		this.contatoDAO = dao;
	}
	
	
	
	public void salvar( Contato contato){
		contatoDAO.salvar(contato);
		
	}
	
}

o meu controlador

package contatos.domain;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component("createContato")
@Scope("request")

public class ContatoMB {
	
	Contato contato = new Contato();
	
	@Autowired
	ContatoService service;

	public Contato getContato() {
		return contato;
	}

	public void setContato(Contato contato) {
		this.contato = contato;
	}
	
	public String salvar(){
		service.salvar(contato);
		contato = new Contato();
		return null;
	}

}

o meu web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>WebTeste</display-name>
  <welcome-file-list>
    <welcome-file>/faces/index.jsp</welcome-file>
  </welcome-file-list>
  
  <context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
  <context-param>
  <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
  <param-value>.jsf</param-value>
 </context-param>
  
  <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>  
    
    <filter>
       <filter-name>openEntityManager</filter-name>
         <filter-class> org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
     </filter> 
  
  
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>org.apache.myfaces.webapp.MyFacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
  </servlet-mapping>
</web-app>

e o 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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:lang="http://www.springframework.org/schema/lang"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/jee
        http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
        http://www.springframework.org/schema/lang
        http://www.springframework.org/schema/lang/spring-lang-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/util 
        http://www.springframework.org/schema/util/spring-util-3.0.xsd"
    default-autowire="byName">
	
	<tx:annotation-driven transaction-manager="transactionManager"/>
	 
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="username" value="postgres" />
        <property name="password" value="deisee" />
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://localhost:5432/web-jpa" />
    </bean>
 
    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="spring.training" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="generateDdl" value="true" />
                <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />
            </bean>
        </property>
    </bean>
 
 
    <context:component-scan base-package="contatos" />
    <context:annotation-config />
 
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
 	<property name="entityManagerFactory" ref="entityManagerFactory"></property>
	</bean>
      
</beans>

o problema é que quando eu coloco a anotação @Transactional na classe ContatoDAO
eu recebo o seguinte erro:

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'contatoService' defined in file [/home/felipe/ESTUDO JSF/workspace-jsf/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/WebTeste/WEB-INF/classes/contatos/domain/ContatoService.class]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type '$Proxy16 implementing contatos.domain.IDAO,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'contatos.domain.ContatoDAO' for property 'contatoDAO'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [$Proxy16 implementing contatos.domain.IDAO,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [contatos.domain.ContatoDAO] for property 'contatoDAO': no matching editors or conversion strategy found
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:574)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
	at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4467)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)
	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:593)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type '$Proxy16 implementing contatos.domain.IDAO,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'contatos.domain.ContatoDAO' for property 'contatoDAO'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [$Proxy16 implementing contatos.domain.IDAO,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [contatos.domain.ContatoDAO] for property 'contatoDAO': no matching editors or conversion strategy found
	at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:462)
	at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:499)
	at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:493)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1363)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1322)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1076)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
	... 26 more
Caused by: java.lang.IllegalStateException: Cannot convert value of type [$Proxy16 implementing contatos.domain.IDAO,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [contatos.domain.ContatoDAO] for property 'contatoDAO': no matching editors or conversion strategy found
	at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:231)
	at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:447)
	... 32 more

Se alguém puder me ajudar eu agradeço

1 Resposta

rogelgarcia

Tente trocar o tipo de proxy do spring para utilizar CGLIB ao invés de Interface Proxys… (Assim será possível fazer o cast que o spring está querendo fazer… caso contrário a sua dependencia só poderá ser de interfaces)

Criado 19 de julho de 2010
Ultima resposta 19 de jul. de 2010
Respostas 1
Participantes 2