3

Spring + GAEを有効にしたaoolicationを書き込もうとしていますが、非常に奇妙な問題に直面しています。

永続性レイヤーの場合、次のpersistence.xmlファイルを使用してJPAを使用します。

<?xml version="1.0" encoding="UTF-8" ?>
<persistence 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" 
    version="1.0">

    <persistence-unit name="transactions-optional">
        <provider>org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider</provider>
        <properties>
            <property name="datanucleus.NontransactionalRead" value="true" />
            <property name="datanucleus.NontransactionalWrite" value="true" />
            <property name="datanucleus.ConnectionURL" value="appengine" />
        </properties>
    </persistence-unit>

</persistence>

また、次の宣言を含むSpring構成ファイルがあります。

 <?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-3.0.xsd
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <tx:annotation-driven />

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="transactions-optional" />
    </bean>

    <bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <bean id="datastoreService" class="com.google.appengine.api.datastore.DatastoreServiceFactory" factory-method="getDatastoreService" />

    <bean id="memcacheServiceUser" class="com.google.appengine.api.memcache.MemcacheServiceFactory" factory-method="getMemcacheService">
        <constructor-arg value="UserCache"/>
    </bean> 

</beans>

そして最後に、ad @Repositoryとマークされ、JpaDaoSupportを拡張するDAOコンポーネントがあり、このBeanをスキャンするように構成されています。

そして、そのDAO Beanを初期化しようとすると、次の例外が発生します。

Caused by: java.lang.IllegalArgumentException: entityManagerFactory or jpaTemplate is required
at org.springframework.orm.jpa.support.JpaDaoSupport.checkDaoConfig(JpaDaoSupport.java:120)
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$5.run(AbstractAutowireCapableBeanFactory.java:1467)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1465)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
... 30 more

次に、ログを確認すると、entityManagerFactoryがDAO initの前に正常に作成されていることがわかりますが、DAOオブジェクトの初期化が実際に開始される直前に、springはこれを含むすべてのシングルトンを破棄します。ログはたくさんありますが、entityManagerFactoryも作成することは間違いありません。私にとって非常に奇妙なことのひとつは、springが次のログメッセージですべてのシングルトンを破棄する理由です。

    INFO: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1594a88: defining beans [org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,entityManagerFactory,transactionManager,datastoreService,memcacheServiceUser,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,userDaoJpa,employeeDS,messageSource]; root of factory hierarchy
Jan 14, 2011 11:12:12 AM org.springframework.beans.factory.support.DisposableBeanAdapter destroy
FINE: Invoking destroy() on bean with name 'entityManagerFactory'
Jan 14, 2011 11:12:12 AM org.springframework.orm.jpa.AbstractEntityManagerFactoryBean destroy
INFO: Closing JPA EntityManagerFactory for persistence unit 'transactions-optional'
Jan 14, 2011 11:12:12 AM org.springframework.web.context.ContextLoader initWebApplicationContext
SEVERE: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDaoJpa' defined in file 
4

3 に答える 3

0
@Autowired
public ClaseDaoImpl(EntityManagerFactory entityManagerFactory) {
    setEntityManagerFactory(entityManagerFactory);
}

それぞれ Dao によって実装されます。

于 2016-06-29T22:52:16.327 に答える
0

クラス JpaDaoSupport では、構築時にEntityManagerFactoryorを設定する必要がありますJpaTemplate。このような何かがそれを行う必要があります:

@Repository
public class YourDAOImpl extends JpaDaoSupport implements YourDAO
{
    @Autowired
    public YourDAOImpl(EntityManagerFactory entityManagerFactory)
    {
        setEntityManagerFactory(entityManagerFactory);
    }

    ...
}
于 2011-04-01T19:01:50.130 に答える
0

以下を使用して、エンティティマネージャーを自動的に挿入できます。

@PersistenceContext
private EntityManager entityManager;
于 2011-04-01T19:12:34.737 に答える