Не удалось @Autowire реализации класса, путаница прокси - PullRequest
1 голос
/ 10 ноября 2019

Я использую Spring-boot для создания мультимодульного приложения Maven. У меня есть сервисный слой в одном модуле, веб-слой в другом. Я не могу запустить приложение из-за следующей ошибки:

The bean 'Service' could not be injected as a 'Service' because it is a JDK dynamic proxy that implements:


Action:

Consider injecting the bean as one of its interfaces or forcing the use of CGLib-based proxies by setting proxyTargetClass=true on @EnableAsync and/or @EnableCaching.

Попытка аннотирования классов конфигурации с помощью

@EnableAsync(proxy-target-class=true)
@EnableCaching(proxy-target-class=true)
@EnableTransactionManagement(proxy-target-class=true)
@EnableAspectJAutoProxy(proxy-target-class=true)

Как только я добавлю аннотацию типа @PreAuthorize или @Транзакционное приложение перестает работать.

Сервис не реализует никакого интерфейса, я хочу, чтобы Spring использовал прокси-сервер CGLib для автоматического подключения, и из журнала трассировки я вижу следующее:

* Adding transactional method 'Service.remove' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
* Creating implicit proxy for bean 'Service' with 0 common interceptors and 3 specific interceptors.
* Creating CGLIB proxy: SingletonTargetSource for target object [Service@17765082]
* Adding transactional method 'Service$$EnhancerBySpringCGLIB$$6f15732.remove' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
* Creating implicit proxy for bean 'Service' with 0 common interceptors and 2 specific interceptors
* Creating JDK dynamic proxy: SingletonTargetSource for target object [Service$$EnhancerBySpringCGLIB$$6f15732@32142479]

Исключением для автоматической разводки является:

Bean named 'locationService' is expected to be of type 'Service' but was actually of type 'com.sun.proxy.$Proxy202'

Означает ли это, что Spring регистрирует мой сервис как прокси-сервер CGLib и прокси-сервер JDK? Если это так, как я могу заставить его использовать только прокси-сервер CGLib?

1 Ответ

0 голосов
/ 10 ноября 2019

Проблема решена на догадку. Spring AOP работает правильно и использует CGLib-прокси, как и ожидалось. Проблема была в зависимости, которая выполняла переопределение прокси.

Я использовал JavaMelody для мониторинга, и он создавал JDK прокси для прокси, созданных CGLib.

Тем не менее, удаляя Java Melody,или настройте его для работы с CGLib, как указано здесь JavaMelody-ISSUE-502 решает проблему, и приложение работает должным образом.

...