2015-12-15 2 views
6

Я хотел бы использовать транзакции, выполненные по аспектам в применении пружинных загрузок, но до сих пор я в основном нашел помощь для более «обычных» установок ...Как настроить приложение загрузки весны для использования транзакций aspectj?

Что мне удалось настроить до сих пор?

Я получил эти аннотации на основном классе:

@SpringBootApplication 
@EnableTransactionManagement(mode=AdviceMode.ASPECTJ) 
@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED) 

И это в моих свойствах:

spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext 

Я запускаемый с Java Agents пружинного инструментом и AspectJ-ткачом и Я могу видеть аспекты в stacktrace, где я использовал @Transactional, так что, по крайней мере, это работает.

Кроме того, что действительно странно, проблема началась только после того, как я добавил второй объект - первый один работал без проблем, но теперь у меня эта ошибка:

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 

Из того, что я заметил BeanFactory является null когда invokeWithinTransaction в настоящее время работает на TransactionAspectSupport - но это время устанавливается во время создания боба (и от того, что я видел в отладке, когда beanFactory является nullTransactionAspectSupport не будет начать транзакцию, поскольку он не в состоянии получить TransactionManager). Я предполагаю, что в какой-то момент создается не-bean-экземпляр TransactionAspectSupport, и это может быть причиной моей проблемы (но тогда как и почему?)?

Update:

Из того, что я заметил @Transactional обрабатывается AnnotationTransactionAspect в одном случае, но JtaAnnotationTransactionAspect в другой.

Любые идеи, что мне не хватает? Возможно, какое-то волшебное свойство я должен установить?

О, и вот моя зависимость, если это важно:

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-aop</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-jpa</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-freemarker</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-jdbc</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>com.h2database</groupId> 
     <artifactId>h2</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
     <version>18.0</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>2.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-instrument</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjrt</artifactId> 
     <version>1.8.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjweaver</artifactId> 
     <version>1.8.7</version> 
    </dependency> 
</dependencies> 
+0

Вам не нужно устанавливать текущий контекст сеанса, как это уже сделано весной. Также вы используете простой спящий режим или JPA? Можете ли вы также опубликовать, как вы запускаете приложение. –

+0

Ну ... Я начинаю с простого запуска основного класса, который имеет SpringApplication.run (Application.class, args); 'в основном методе и аннотации, о которых идет речь. Ничего особенного, так как я стараюсь, чтобы мои модификации были минимальными. EDIT: также, я запускаю его с двумя javaagent, заданными, как описано в вопросе. – korda

ответ

1

Ok. Я идиот, который не смотрел, что делает аутоимпорт.

Я использовал org.springframework.transaction.annotation.Transactional в одном месте и javax.transaction.Transactional в другом.

После того, как все было заменено на пружину при условии, что @Transactional начал работать.

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