2012-03-20 2 views
1

Я уверен, что мое приложение работало прямо до вчерашнего дня, когда я получил эту ошибку:Spring автоматическое связывание перестало работать на 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

Я использую 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 и мой местный (МВН GAE :бег). И почему на прошлой неделе это сработало отлично.

Прошу вас, ГАИ, поддержите меня! Я схожу с ума по этому вопросу

(я, вероятно, начать баунти, это слишком срочно)

EDIT мой 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

+0

no ... :(см. Править –

+0

Какова последняя модификация, которую вы сделали до этой ошибки? Вы должны были что-то сделать, если она работала раньше. –

ответ

0

Проблема заключается в @Transactional аннотаций на классе @Service. Он использует javax.naming.NamingException в той части, которую я не знаю, и это не белый список.

3

кажется что SessionFactoryImpl ссылается на класс, который google не имеет в его whiteliste, и он не может быть загружен в этом случае.

Вот статья о том, что: http://googlecloudsql.blogspot.de/

+0

и так? Каково решение для использования hibernate? –

+0

Ну, похоже, вы не можете просто использовать ЛЮБОЙ класс, как в автономном режиме Вот список всех разрешенных классов: http://code.google.com/appengine/docs/java/jrewhitelist.html –

+1

Если ваше приложение использует JPA, я бы просто использовал другой поставщик JPA. просто невозможно использовать Hibernate из коробки в Google Cloud. Но я нашел статью о том, что у кого-то действительно есть и работает ... так что mabe это помогает: http : //cloud.dzone.com/articles/spring-hibernate-google –

1

Фабио помог мне в правильном направлении. Я обнаружил, что декларативные транзакции, использующие @Transactional, не работают в GAE, потому что Spring проверяет org.hibernate.impl.SessionFactoryImpl, который вызывает загрузку классов javax.naming, которые не входят в белый список GAE. У меня была такая же проблема, что и на объявления на основе XML. Поэтому я закончил использование программного управления транзакциями с использованием объектов TransactionTemplate и, похоже, работает.

EDIT: Добавлен пример кода

С моей конфигурации яровой я удалил <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 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); 
      } 
     }); 
    } 
} 

Один недостаток я обнаружил, что я должен был Превратить проверяемые исключения бросили мои методы обслуживания непроверенной исключения, потому что проверенные исключения не согласны с подписью doInTransactionWithoutResult

+0

Надеюсь, что команда GAE позаботится о том, что скоро это действительно важно. Можете ли вы опубликовать код, который вы использовали? Просто, например, спасибо –

+0

Я обновил исходное сообщение, чтобы включить образец кода –

Смежные вопросы