Spring e JPA - erro!

1 resposta
ThiagoWorldCoder

Bom dia!!

Estou tentando utilizar o Spring com JPA, só que estou apanhando um pouco, deu um erro e eu não sei o que é!!

Galera, consegui resolver parte… tinha colocado o nome errado do applicationContext.xml… erro primário…

mudou o erro novamente…

java.lang.NoSuchMethodError: javax.persistence.PersistenceContext.properties()[Ljavax/persistence/PersistenceProperty;
	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.<init>(PersistenceAnnotationBeanPostProcessor.java:543)
	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$2.doWith(PersistenceAnnotationBeanPostProcessor.java:376)
	at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:402)
	at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:379)
	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findPersistenceMetadata(PersistenceAnnotationBeanPostProcessor.java:364)
	at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(PersistenceAnnotationBeanPostProcessor.java:295)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:678)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:419)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:383)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:353)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:400)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:736)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:369)
	at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:96)
	at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:44)
	at org.springframework.test.context.TestContext.buildApplicationContext(TestContext.java:198)
	at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:233)
	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:126)
	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:85)
	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:231)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:95)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:139)
	at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
	at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
	at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:26)
	at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:36)
	at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

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:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="persistenceUnitName" value="JPAProject" />
	</bean>
	
	<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
	
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>
	
	<tx:annotation-driven/>
	
	<bean id="cidadeDao" class="br.com.testes.dao.CidadeDaoImp" />
	
</beans>

eu estou usando o eclipse, portanto ele gerou o meu persistence.xml desta forma:
Achei muito estranho, porque, aonde está a configuração de banco?? Eu fiz com a ferramenta automática e ele gerou isso no persistence.xml.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
	<persistence-unit name="JPAProject">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<class>
		br.com.testes.entities.Cidade</class>
		
		<properties>
			<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
		<property name="hibernate.connection.url" value="jdbc:mysql://localhost/jsf"/>
		<property name="hibernate.connection.username" value="root"/>
		<property name="hibernate.connection.password" value="newyork"/>
		
		<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
		<property name="hibernate.show_sql" value="true"/>
		<property name="hibernate.format_sql" value="true"/>
		<property name="hibernate.hbm2ddl.auto" value="true"/>
		</properties>
	</persistence-unit>
</persistence>

Eu tentei criar a classe de teste do dao desta forma:

package br.com.testes.dao.tests;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;

import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import br.com.testes.dao.CidadeDao;
import br.com.testes.entities.Cidade;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:**/appicationContext*.xml"})
public class TestCidadeDao {

	private CidadeDao cidadeDao;

	@Autowired
	public void setCidadeDao(CidadeDao cidadeDao) {
		this.cidadeDao = cidadeDao;
	}
	
	private Integer id = 1;

	private Cidade getCidade(){
		Cidade cidade = new Cidade();
		cidade.setNome("Teste");
		return cidade;
	}
	
	@Test
	public void testSalvar() {
		Cidade cidade = null;
		cidade = cidadeDao.salvar(getCidade()); 
		assertNotNull(cidade);
		assertEquals(id, cidade.getId());
		assertEquals("Teste", cidade.getNome());
	}
	
	@Test
	public void testAtualizar() {
		Cidade cidade = cidadeDao.pesquisarPorId(id);
		cidade.setNome("Teste 2");
		cidade = cidadeDao.atualizar(cidade);
		assertNotNull(cidade);
		assertEquals("Teste 2", cidade.getNome());
	}

	@Test
	public void testTodos() {
		List<Cidade> cidades = cidadeDao.todos();
		assertNotNull(cidades);
		assertEquals(1, cidades.size());
		assertEquals("Teste 2", cidades.get(0).getNome());
	}

	@Test
	public void testPesquisarPorId() {
		Cidade cidade = cidadeDao.pesquisarPorId(id);
		assertNotNull(cidade);
		assertEquals(id, cidade.getId());
		assertEquals("Teste 2", cidade.getNome());
	}

	@Test
	public void testExcluir() {
		Cidade cidade = cidadeDao.pesquisarPorId(id);
		cidadeDao.excluir(cidade);
		assertNull(cidadeDao.pesquisarPorId(id));
	}

}

por favor se alguém puder me ajudar agradeço!!!

1 Resposta

I

Solução

  1. Run as -> Open Run Dialog… -> Classpath
  2. Adiciona persistence-api.jar no Bootstrap

Não gosto dessa necessidade de configuração manual. Se alguém souber como automatizar isso de alguma forma, via maven (m2eclipse) por exemplo, avisa.

Criado 11 de julho de 2008
Ultima resposta 11 de jul. de 2008
Respostas 1
Participantes 2