2012-03-20 125 views
1

工作,我敢肯定,我的应用程序的工作权利,直到昨天,当我得到这个错误:弹簧自动装配停在GAE

Failed startup of context [email protected]1079ff{/,/ base/data/home/apps/s~trewnewmedia/1.357617962256387950} org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scadenziarioController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void it.trew.prove.web.controllers.ScadenziarioController.setScadenzaService(it. trew.prove.services.ScadenzaService); nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scadenzaService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void it.trew.prove.services.ScadenzaService.setSocietaService(it.trew.prove.serv ices.SocietaService); nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'societaService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void it.trew.prove.services.SocietaService.setSocietaDao(it.trew.prove.model.dao .Dao); nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dao': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mySessionFactory': Post-processing of the FactoryBean's object failed; nested exception is java.lang.SecurityException: Unable to get members for class org.hibernate.impl.SessionFactoryImpl

我使用与谷歌云SQL冬眠,它总是工作。

在我的本地机器上,使用本地MySQL,它仍然有效!

我不认为这是一个云SQL问题,因为删除一些自动装配(测试)它仍然连接等。这里是我的xml:

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="myDataSource" /> 
     <property name="annotatedClasses"> 
      <list> 
       <value>it.trew.prove.model.beans.Scadenza</value> 
       <value>it.trew.prove.model.beans.Fornitore</value> 
       <value>it.trew.prove.model.beans.Societa</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">create</prop> 
       <!-- <prop key="hibernate.hbm2ddl.import_files">/setup.sql</prop> --> 
      </props> 
     </property> 
    </bean> 

我的一块DAO的:

@Component 
public class Dao { 

    @Resource(name = "mySessionFactory") 
    private SessionFactory sessionFactory; 
... 

我的服务:

@Service 
@Transactional 
public class SocietaService { 

    private Dao societaDao; 

    @Autowired 
    public void setSocietaDao(Dao societaDao) { 
     this.societaDao = societaDao; 
    } 
... 

我找不到什么是GAE和我的地方之间的不同(MVN GAE :跑)。 上周为什么完美运作。

请GAE团队支持我!我对这个问题

快要疯了(我可能会开始一个赏金,这太过分了急)

编辑我的pom.xml冬眠部分:

<!-- Hibernate framework --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>3.3.2.GA</version> 
     <type>pom</type> 
     <!--hibernate-dependencies is a pom, not needed for hibernate-core--> 
     </dependency> 
     <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-annotations</artifactId> 
     <version>3.4.0.GA</version> 
    </dependency> 
    <dependency> 
     <groupId>javassist</groupId> 
     <artifactId>javassist</artifactId> 
     <version>3.12.1.GA</version> 
    </dependency> 
+0

的签字同意核心问题是:'无法获取org.hibernate.impl.SessionFactoryImpl类的成员是否需要更新Hibernate模块? – vacuum 2012-03-20 10:18:11

+0

没有...... :(见编辑 – 2012-03-20 12:00:19

+0

这个错误发生之前你做过的最后一次修改是什么?如果它之前在工作,你必须做些什么。 – 2012-03-21 10:29:49

回答

0

的问题是在@Service类@Transactional注释。它在我不知道的某个部分使用javax.naming.NamingException,而这不是白名单的类。

3

似乎SessionFactoryImpl引用了一个谷歌没有的白名单上的类,它不能在这种情况下加载。

下面是有关的文章:http://googlecloudsql.blogspot.de/

+0

等等?使用hibernate的解决方案是什么? – 2012-03-23 07:55:23

+0

好像你不能像在独立的情况下一样使用ANY类以下是所有允许的类的列表:http://code.google.com/appengine/docs/java/jrewhitelist.html – 2012-03-23 09:20:44

+1

如果您的应用程序使用的是JPA,那么我会简单地使用不同的JPA提供程序。根本不可能在Google Cloud上使用Hibernate,但是我发现了一些关于某人实际上已经启动并运行的文章...所以mabe这会有所帮助:http ://cloud.dzone.com/articles/spring-hibernate-google – 2012-03-23 09:23:52

1

法比奥帮助我指出了正确的方向。我发现使用@Transactional的声明性事务在GAE中不起作用,因为Spring扫描了org.hibernate.impl.SessionFactoryImpl,这会导致加载不在GAE白名单上的javax.naming类。我有同样的问题切换到基于XML的声明。所以我最终使用了使用TransactionTemplate对象的编程事务管理,并且似乎正在工作。

编辑:添加代码示例

从我的春天配置我删除<tx:annotation-driven/>禁用@Transactional与

<bean id="defaultTransactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> 
    <property name="transactionManager"><ref local="transactionManager"/></property> 
</bean> 

取代它,如果你正在使用多个事务语义如PROPAGATION_REQUIRED和PROPAGATION_SUPPORTS,您必须创建额外的bean,每个场景一个bean。

<bean id="supportingTransactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> 
    <property name="propagationBehaviorName" value="PROPAGATION_SUPPORTS"/> 
    <property name="transactionManager"><ref local="transactionManager"/></property> 
</bean> 

我用@Transactional表示法留下了我的原始服务类。这并不重要,因为<tx:annotation-driven/>已被删除,如果问题得到解决,我可能会在某一天切换回去。相反,我sublcassed他们使用TransactionTemplate的

public class GAEUserService extends UserService { 

    @Autowired 
    private TransactionTemplate defaultTransactionTemplate; 

    @Override 
    public void update(final User user) { 
     defaultTransactionTemplate.execute(new TransactionCallbackWithoutResult() { 
      @Override 
      protected void doInTransactionWithoutResult(TransactionStatus status) { 
       UserService.super.update(user); 
      } 
     }); 
    } 
} 

一个缺点我发现了,我不得不转换检查异常,由我服务的方法来unchecked异常抛出,因为检查的异常不doInTransactionWithoutResult

+0

我希望GAE团队很快就会关注这一点,这非常重要。你可以发布你使用的代码吗?举个例子,谢谢 – 2012-04-28 17:02:40

+0

我更新了原文,包括一个代码示例 – 2012-04-29 20:08:28