Пружина Autowiring перестала работать на GAE - PullRequest
1 голос
/ 20 марта 2012

Я уверен, что мое приложение работало правильно до вчерашнего дня, когда я получил эту ошибку:

Не удалось запустить контекст com.google.apphosting.utils.jetty.RuntimeAppEngineWebAppContext@1079ff {/, /base / data / home / apps / s ~ trewnewmedia / 1.357617962256387950} org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем 'scadenziarioController': сбой внедрения зависимостей с автопроводкой;вложенным исключением является org.springframework.beans.factory.BeanCreationException: не удалось автоматически подключить метод: public void it.trew.prove.web.controllers.ScadenziarioController.setScadenzaService (it. trew.prove.services.ScadenzaService);вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка создания бина с именем 'scadenzaService': сбой внедрения зависимостей с автопроводкой;вложенным исключением является org.springframework.beans.factory.BeanCreationException: не удалось автоматически подключить метод: public void it.trew.prove.services.ScadenzaService.setSocietaService (it.trew.prove.serv ices.SocietaService);вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем societaService: сбой внедрения зависимостей с автопроводкой;вложенным исключением является org.springframework.beans.factory.BeanCreationException: не удалось автоматически подключить метод: public void it.trew.prove.services.SocietaService.setSocietaDao (it.trew.prove.model.dao .Dao);вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем 'dao': ошибка внедрения зависимостей ресурса;вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка создания бина с именем 'mySessionFactory': пост-обработка объекта 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>

Ответы [ 3 ]

3 голосов
/ 23 марта 2012

Похоже, что SessionFactoryImpl ссылается на класс, которого у Google нет в своем белом списке, и в этом случае он не может быть загружен.

Вот статья об этом: http://googlecloudsql.blogspot.de/

1 голос
/ 28 апреля 2012

Фабио помог направить меня в правильном направлении. Я обнаружил, что декларативные транзакции, использующие @Transactional, не работают в GAE, потому что Spring сканирует org.hibernate.impl.SessionFactoryImpl, который вызывает загрузку классов javax.naming, которых нет в белом списке GAE. У меня была та же проблема, переходящая на объявления на основе 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 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/> был удален, и я мог бы когда-нибудь переключиться обратно, если проблема будет решена. Вместо этого я поместил их в субтитры для использования 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 голосов
/ 05 апреля 2012

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

...