【问题标题】:Spring Autowiring stopped working on GAESpring Autowireing 停止在 GAE 上工作
【发布时间】:2012-04-04 17:47:30
【问题描述】:

我确定我的应用程序一直运行到昨天,当我收到此错误时:

上下文启动失败 com.google.apphosting.utils.jetty.RuntimeAppEngineWebAppContext@1079ff{/,/ 基础/数据/主页/应用程序/s~trewnewmedia/1.357617962256387950} org.springframework.beans.factory.BeanCreationException:错误 创建名为“scadenziarioController”的bean:注入 自动装配依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 自动装配方法:公共无效 it.trew.prove.web.controllers.ScadenziarioController.setScadenzaService(it. trew.prove.services.ScadenzaService);嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为“scadenzaService”的bean:注入自动装配 依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 自动装配方法:公共无效 it.trew.prove.services.ScadenzaService.setSocietaService(it.trew.prove.serv ices.SocietaService);嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为“societaService”的bean:注入自动装配 依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 自动装配方法:公共无效 it.trew.prove.services.SocietaService.setSocietaDao(it.trew.prove.model.dao .道);嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为“dao”的bean:注入资源依赖项 失败的;嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为“mySessionFactory”的bean:后处理 FactoryBean 的对象失败;嵌套异常是 java.lang.SecurityException:无法获取类的成员 org.hibernate.impl.SessionFactoryImpl

我将 Hibernate 与 Google Cloud SQL 结合使用,它始终有效。

在我的本地机器上,使用本地 MySQL,它仍然可以工作!

我认为这不是 Cloud 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:run) 之间的不同之处。 以及为什么上周效果很好。

请 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>

【问题讨论】:

  • 核心问题是:Unable to get members for class org.hibernate.impl.SessionFactoryImpl你更新了你的Hibernate模块还是什么的?
  • 在出现此错误之前您所做的最后一次修改是什么?如果它以前有效,你一定做过。
  • 无修改!我认为 GAE 有问题。我部署到另一台服务器,它工作。它根本无法实例化我的会话工厂 bean。我不明白为什么。

标签: spring hibernate google-app-engine autowired


【解决方案1】:

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

这是一篇关于此的文章:http://googlecloudsql.blogspot.de/

【讨论】:

  • 等等?使用hibernate的解决方法是什么??
  • 好吧,您似乎不能像在独立应用程序中那样使用任何类。以下是所有允许的类的列表:code.google.com/appengine/docs/java/jrewhitelist.html
  • 如果您的应用程序正在使用 JPA,我会简单地使用不同的 JPA 提供程序。看来目前根本不可能在 Google Cloud 上开箱即用地使用 Hibernate。但是我发现了一些关于某人实际上已经启动并运行它的文章......所以这可能会有所帮助:cloud.dzone.com/articles/spring-hibernate-google
【解决方案2】:

问题是@Service 类上的@Transactional 注解。它在我不知道的某些部分使用了 javax.naming.NamingException,这不是列入白名单的类。

【讨论】:

    【解决方案3】:

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

    编辑:添加代码示例

    从我的 spring 配置中,我删除了 &lt;tx:annotation-driven/&gt; 以禁用 @Transactional 并将其替换为

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

    如果您使用多个事务语义,例如PROPAGATION_REQUIRED 和 PROPAGATION_SUPPORTS,您必须创建额外的 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 表示法离开了我原来的服务类。没关系,因为&lt;tx:annotation-driven/&gt; 已被删除,如果问题得到解决,我可能会在某一天切换回来。相反,我将它们转为使用 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);
                }
            });
        }
    }
    

    我发现的一个缺点是我必须将我的服务方法抛出的已检查异常转换为未检查异常,因为已检查异常与 doInTransactionWithoutResult 的签名不一致

    【讨论】:

    • 我希望 GAE 团队能尽快解决这个问题,这非常重要。您可以发布您使用的代码吗?举个例子谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多