Странная ошибка на createInjector "Невозможно перехватить метод"
У меня есть некоторый опыт работы с хитростью, и я только что попробовал guice-persist. Но теперь я получаю очень странную ошибку в моем очень простом модуле. Это мой модуль:
public class VotingModule extends AbstractModule {
@Override
protected void configure() {
bind(VotingService.class).to(VotingServiceImpl.class);
}
}
Я создал фабрику (это для использования этого API, нет главного), чтобы получить экземпляр службы:
public static VotingService getService(final String persistenceUnit) {
// initialization of dependency injection
Injector i = Guice.createInjector(new JpaPersistModule(persistenceUnit), new VotingModule());
// Starts persistence stuff (jpa is ready now)
i.getInstance(PersistService.class).start();
return i.getInstance(VotingService.class);
}
VotingService и его реализация инкапсулируют простые взаимодействия с базой данных. Для этого "VotingServiceImpl" внедряет только EntityManager и использует @Transactionl в некоторых методах. Так почему я получаю
1) Unable to method intercept: com.prodyna.nabucco.groupware.voting.core.service.impl.VotingServiceImpl
at com.prodyna.nabucco.groupware.voting.core.service.impl.VotingModule.configure(VotingModule.java:10)
? Ошибка выдается в этом простом тесте:
@Test
public void test(){
VotingService vs = VotingServiceFactory.getService();
}
Редактировать Эта ошибка возникает, только если связанная реализация использует @Transactional. Что-то пошло не так с Aop, но как это исправить?редактировать
3 ответа
Хорошо, я нашел проблему после нескольких часов отладки: проблема была в частном конструкторе в реализации интерфейса. Для ванильного стиля хорошо подходят частные конструкторы (имхо, хорошая практика - вы не можете использовать "новый"). но AOP (Interceptors) не работает с частными конструкторами.
Я думаю, что в документе должны быть какие-то намеки на это?!
Обновление Guice с 4.0 до 4.2.1 решило ту же ошибку, о которой я сообщил. Обратите внимание, что это проявляется только в первую очередь при обновлении с JDK 1.8 до 1.10.
В моем случае эта ошибка была вызвана статическим членом, инициализированным с использованием конструктора.
private static final CacheControl CACHE_CONTROL = new CacheControl();
Поменял его на нестатичный член.
private final CacheControl cacheControl = new CacheControl();