除了其他答案,特别是 Jeff Bowman 和 uldall 的答案:
确保您的 Guice 版本与您的 JDK/JRE 运行时一致
我刚刚遇到了这个问题,因为我使用的是 Java 17 运行时和不支持它的 Guice (5.0.1) 版本;它至少需要 5.1.0!
如果您认为您使用的是正确的 Guice 版本,但它仍然会损坏......
您可能需要调试您的 CLASSPATH。如果您使用的是依赖项管理器:
- 确保您的 CLASSPATH 不会碰巧插入“寄生虫”过时版本作为传递依赖项。使用 Gradle,该
:dependencies
任务将有助于调试。
- 您的 IDE 可能有一个错误,它的 CLASSPATH 冲突解决方案(应该用新版本覆盖旧版本的传递依赖项)可能无法按预期工作。这在 Eclipse Buildship 中发生在我身上,我必须明确阻止项目引入过时的依赖项:
implementation("another-dependency:x.y.z") {
exclude group: 'com.google.inject', module: 'guice'
}
奖励:验证 Guice 的仪器是否正常工作
当 Guice 未能正确检测代码时没有反馈,这有点烦人,除了随后抛出的异常(例如javax.persistence.TransactionRequiredException
)。
为了验证它是否实际工作,检查@Transactional
方法中的调用堆栈可能很有用,如下所示:
@Transactional
void myTransactionalMethod() {
StackWalker.getInstance().forEach(System.out::println);
// rest of method
}
如果 Guice 的检测工作正常,您会com.google.inject.persist.jpa.JpaLocalTxnInterceptor
在标准输出的调用堆栈中找到。
您还可以使用 IDE 的调试器;只需在方法的开头放置一个断点@Transactional
并检查调用堆栈。
javax.transaction.Transactional
根据 uldall 的回答,这允许验证即使在当前版本的 Guice (5.1.0) 中,Guice 仍然不支持注释。