Странная ошибка на 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();
Другие вопросы по тегам