весна связывание, то не с @транзакций


Я хочу использовать аннотацию @Transactional в методе save() пользовательского сервиса (конкретного класса) следующим образом:

@Service
public class UserService {

    @Transactional
    public Long save(User userCommand, BindingResult result) {
    ...
    }

}

Я использую эту услугу в MyRealm by autowiring.

public class MyRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

}

Однако он завершается со следующей ошибкой:

java.lang.IllegalArgumentException: Can not set n.r.c.s.user.UserService field n.r.c.s.realm.MyRealm.userService to com.sun.proxy.$Proxy48

Конечно, это работает, если я удаляю аннотацию @Transational.

Мои настройки диспетчера транзакций выглядят следующим образом:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />
Пожалуйста, дайте мне знать, что не так с моим кодом?

Нужно ли мне настроить что-то вроде доверенность?

1 3

1 ответ:

Когда проксирование включено, вы должны использовать интерфейсы, а не реализации.

@Service
public class UserService implements SomeInterface {

@Transactional
public Long save(User userCommand, BindingResult result) {
...
}

}


public class MyRealm extends AuthorizingRealm {

@Autowired
private SomeInterface userService;

}

Если вы не хотите этого делать, вы всегда можете проверить конфигурацию AOP. вы, вероятно, делаете прокси для прокси-сервера где-то.