복붙노트

[SPRING] GAE에서 작동하지 않는 Spring Autowiring

SPRING

GAE에서 작동하지 않는 Spring Autowiring

나는이 오류가 발생했을 때 어제까지 내 응용 프로그램이 올바르게 작동했다고 확신합니다.

나는 Google Cloud SQL과 함께 Hibernate를 사용하고 있으며 항상 작동합니다.

내 로컬 컴퓨터에서 로컬 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 : 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>

해결법

  1. ==============================

    1.SessionFactoryImpl은 google에없는 클래스를 화이트리스트로 참조하며,이 경우로드 될 수 없습니다.

    SessionFactoryImpl은 google에없는 클래스를 화이트리스트로 참조하며,이 경우로드 될 수 없습니다.

    http://googlecloudsql.blogspot.de/에 대한 기사가 있습니다.

  2. ==============================

    2.Fabio는 올바른 방향으로 나를 도왔습니다. Spring이 GAE 화이트리스트에없는 javax.naming 클래스의 로딩을 유발하는 org.hibernate.impl.SessionFactoryImpl을 스캔하기 때문에 @Transactional을 사용하는 선언적 트랜잭션은 GAE에서 작동하지 않는다는 것을 알게되었습니다. XML 기반 선언으로 전환하는 것과 동일한 문제가있었습니다. 그래서 TransactionTemplate 객체를 사용하는 프로그래밍 방식의 트랜잭션 관리를 사용하여 작업을 마쳤습니다.

    Fabio는 올바른 방향으로 나를 도왔습니다. Spring이 GAE 화이트리스트에없는 javax.naming 클래스의 로딩을 유발하는 org.hibernate.impl.SessionFactoryImpl을 스캔하기 때문에 @Transactional을 사용하는 선언적 트랜잭션은 GAE에서 작동하지 않는다는 것을 알게되었습니다. XML 기반 선언으로 전환하는 것과 동일한 문제가있었습니다. 그래서 TransactionTemplate 객체를 사용하는 프로그래밍 방식의 트랜잭션 관리를 사용하여 작업을 마쳤습니다.

    편집 : 추가 된 코드 샘플

    스프링 구성에서 @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 표기법으로 남겼다. 가 삭제되었으므로 문제가되지 않으며 문제가 해결되면 언젠가 되돌릴 수 있습니다. 대신 나는 그들에게 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의 서명과 일치하지 않기 때문에 체크되지 않은 예외로 내 서비스 메소드에 의해 던진 체크 된 예외를 변환해야한다는 것이 었습니다

  3. ==============================

    3.문제는 @Service 클래스의 @Transactional 주석입니다. 필자가 모르는 부분에서는 javax.naming.NamingException을 사용하며, 허용 된 클래스가 아닙니다.

    문제는 @Service 클래스의 @Transactional 주석입니다. 필자가 모르는 부분에서는 javax.naming.NamingException을 사용하며, 허용 된 클래스가 아닙니다.

  4. from https://stackoverflow.com/questions/9783773/spring-autowiring-stopped-working-on-gae by cc-by-sa and MIT license