2013-09-17 2 views
0

Если я поместил 'mode = "aspectj" в тег tx: annotation-driven, то Spring-данные обрабатывают транзакции только в файлах @Repository, а не в классах @Service.@Transactional в @Service игнорируется

Вот мой @Service, чтобы получить пользователей:

@Service 
public class RepositoryAuthService implements AuthService{ 

    @Resource 
    AuthUserRepository userRepository; 

    @Transactional(propagation = Propagation.REQUIRED) 
    @Override 
    public User findByCredentials(String userName, String password){ 
     User user = userRepository.getByCredentials(userName, password); 
     TransactionAspectSupport.currentTransactionStatus().toString(); 
     ... 
    } 

Вот моя весна-контекст:

<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" /> 
<jpa:repositories base-package="my.jpatest.dao.auth" /> 
<context:component-scan base-package="my.jpatest.dao.auth"> 
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" /> 
</context:component-scan> 
<bean class="my.jpatest.dao.auth.RepositoryAuthService" id="authService" /> 

Исключение:

org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.currentTransactionStatus(TransactionAspectSupport.java:111) 
    at my.jpatest.dao.auth.RepositoryAuthService.findByCredentials(RepositoryAuthService.java:34) 

Я попытался 'AspectJ' с ' proxy-target-class = "true", но не помогло. Без mode = "aspectj" все в порядке: соединение остается после вызова репозитория, как и ожидалось.

Существует подробная статья об этом, но это довольно долго: http://doanduyhai.wordpress.com/2011/11/20/spring-transactional-explained/

Любые советы?

С уважением: Бенс

ответ

0

Я знаю, что вопрос немного староват, но, возможно, это могло бы работать на кого-то позже,

Я думаю, что причина в том, что у вас есть:

<context:component-scan base-package="my.jpatest.dao.auth"> 
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" /> 
</context:component-scan> 

и там он говорит, что он должен только проверять классы, аннотированные аннотацией репозитория, если вы хотите, чтобы также классы, аннотированные сервисом, добавили еще одну строку include:

<context:include-filter type="annotation" expression="org.springframework.stereotype.Service" /> 

что должно быть.

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