Не определен уникальный бин типа [javax.persistence.EntityManager] - PullRequest
0 голосов
/ 03 июня 2010

Я использую JUnit 4 для тестирования Dao Access с Spring (аннотации) и JPA (спящий режим). Источник данных настраивается через JNDI (Weblogic) с ORacle (Backend). Это постоянство настраивается только с именем и типом транзакции RESOURCE_LOCAL

Файл контекста приложения содержит примечания для аннотаций, конфигурацию JPA, транзакции, а также пакет и конфигурацию по умолчанию для обнаружения аннотаций. Я использую Junit4 так:


ApplicationContext
</p> <pre><code><bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitName" value="workRequest"/> <property name="dataSource" ref="dataSource" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="databasePlatform" value="${database.target}"/> <property name="showSql" value="${database.showSql}" /> <property name="generateDdl" value="${database.generateDdl}" /> </bean> </property> </bean> <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>workRequest</value> </property> <property name="jndiEnvironment"> <props> <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop> <prop key="java.naming.provider.url">t3://localhost:7001</prop> </props> </property> </bean> <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />


JUnit TestCase

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
public class AssignmentDaoTest {
      private AssignmentDao assignmentDao;
      @Test
      public void readAll() {
            assertNotNull("assignmentDao cannot be null", assignmentDao);
            List<Assignment> assignments = assignmentDao.findAll();
            assertNotNull("There are no assignments yet", assignments);
      }
} 


независимо от того, какие изменения я делаю, я получаю:
<br> <b>No unique bean of type [javax.persistence.EntityManager] is defined</b>

Любой намек на то, что это может быть. Я запускаю тесты внутри затмения.

1 Ответ

2 голосов
/ 03 июня 2010

Ваш контекст Spring имеет определение bean-компонента, используя LocalContainerEntityManagerFactoryBean. Это создает EntityManagerFactory, а не EntityManager.

AssignmentDao необходимо подключиться к EntityManagerFactory.

Кроме того, вы можете заменить LocalContainerEntityManagerFactoryBean на LocalEntityManagerFactoryBean, что создаст напрямую EntityManager. Тем не менее, вы должны быть осторожны с этим, у него есть некоторые недостатки. См. Эту часть Spring docs для полного объяснения опций.

Это сбивает с толку, потому что соглашения об именах JPA и Spring перекрывают друг друга, так что именование этих классов - настоящий провал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...