添加@Transactional 注释后注入停止
Injections are stopping after adding @Transactional annotation
我创建了一个 class 可以轻松添加和更新员工。我在 createEmployee 方法中添加了 @Transactional
注释,然后我的实例在我尝试检索数据时开始出错。
@Transactional
@Override
public void createEmployee(Employee employee) {
internalCreateEmployee(employee);
}
没有@Transactional 一切正常,但我可以将任何内容保存到数据库中。当我添加这个注释时,我得到了这个错误。
java.lang.IllegalAccessError: tried to access method
rd.EmployeeManagerImpl.(Lrd./EmployeeDao;Lrd./DepartmentDao;)V
from class rd.EmployeeManagerImpl$$EnhancerByGuice$db9fd74
在 EmployeemanagerImpl 内部,我还在构造函数中注入了我的 DAO 对象。
@Inject
EmployeeManagerImpl(EmployeeDao employeeDao, DepartmentDao departmentDao){
this.employeeDao = employeeDao;
this.departmentDao = departmentDao;
}
@Transactional 破坏的原因是什么?
我只是不知道需要提供哪些信息,如果您需要任何进一步的信息,请询问。
注意:Employee
是一个休眠实体 class。 EmployeeDao
、DepartmentDao
和 EmployeeManagerImpl
都有 @Singleton
注释。
注意2:在堆栈跟踪中,EmployeeManager 实例似乎无法初始化。
com.google.inject.internal.InjectorImpl.get(InjectorImpl.java:987)
com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1009)
org.apache.wicket.guice.GuiceProxyTargetLocator.locateProxyTarget(GuiceProxyTargetLocator.java:105)
org.apache.wicket.proxy.LazyInitProxyFactory$JdkHandler.invoke(LazyInitProxyFactory.java:430)
com.sun.proxy.$Proxy133.getDepartmentList(Unknown Source)
rd.EmployeeFormComponent.addDepartmentDropDown(EmployeeFormComponent.java:59)
rd.EmployeeFormComponent.<init>(EmployeeFormComponent.java:47)
rd.EmployeeAddPanel.<init>(EmployeeAddPanel.java:61)
rd.EmployeeAddModalWindow.<init>(EmployeeAddModalWindow.java:20)
rd.EmployeeAddModalWindow.<init>(EmployeeAddModalWindow.java:20)
rd.ManageEmployeePage.<init>(ManageEmployeePage.java:49)
rd.ManageEmployeePage.<init>(ManageEmployeePage.java:49)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.lang.reflect.Constructor.newInstance(Constructor.java:526)
如果您注射 EmployeeManager
两次,那可能就是问题所在。我猜 EmployeeFormComponent
是 Wicket Component
。 Wicket 的组件有自己的 Guice 注入器。所以如果你用 @Inject
注入你的 EmployeeManager
并且你试图尝试注入其他东西,这意味着你注入了两次。这可能会导致这样的问题。
当您添加 @Transactional
注释时,将生成一个代理 class 来处理交易魔法。由于访问限制,代理 class 似乎无法调用 EmployeeManager 构造函数。我会尝试制作构造函数 public.
我创建了一个 class 可以轻松添加和更新员工。我在 createEmployee 方法中添加了 @Transactional
注释,然后我的实例在我尝试检索数据时开始出错。
@Transactional
@Override
public void createEmployee(Employee employee) {
internalCreateEmployee(employee);
}
没有@Transactional 一切正常,但我可以将任何内容保存到数据库中。当我添加这个注释时,我得到了这个错误。
java.lang.IllegalAccessError: tried to access method rd.EmployeeManagerImpl.(Lrd./EmployeeDao;Lrd./DepartmentDao;)V from class rd.EmployeeManagerImpl$$EnhancerByGuice$db9fd74
在 EmployeemanagerImpl 内部,我还在构造函数中注入了我的 DAO 对象。
@Inject
EmployeeManagerImpl(EmployeeDao employeeDao, DepartmentDao departmentDao){
this.employeeDao = employeeDao;
this.departmentDao = departmentDao;
}
@Transactional 破坏的原因是什么?
我只是不知道需要提供哪些信息,如果您需要任何进一步的信息,请询问。
注意:Employee
是一个休眠实体 class。 EmployeeDao
、DepartmentDao
和 EmployeeManagerImpl
都有 @Singleton
注释。
注意2:在堆栈跟踪中,EmployeeManager 实例似乎无法初始化。
com.google.inject.internal.InjectorImpl.get(InjectorImpl.java:987)
com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1009)
org.apache.wicket.guice.GuiceProxyTargetLocator.locateProxyTarget(GuiceProxyTargetLocator.java:105)
org.apache.wicket.proxy.LazyInitProxyFactory$JdkHandler.invoke(LazyInitProxyFactory.java:430)
com.sun.proxy.$Proxy133.getDepartmentList(Unknown Source)
rd.EmployeeFormComponent.addDepartmentDropDown(EmployeeFormComponent.java:59)
rd.EmployeeFormComponent.<init>(EmployeeFormComponent.java:47)
rd.EmployeeAddPanel.<init>(EmployeeAddPanel.java:61)
rd.EmployeeAddModalWindow.<init>(EmployeeAddModalWindow.java:20)
rd.EmployeeAddModalWindow.<init>(EmployeeAddModalWindow.java:20)
rd.ManageEmployeePage.<init>(ManageEmployeePage.java:49)
rd.ManageEmployeePage.<init>(ManageEmployeePage.java:49)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.lang.reflect.Constructor.newInstance(Constructor.java:526)
如果您注射 EmployeeManager
两次,那可能就是问题所在。我猜 EmployeeFormComponent
是 Wicket Component
。 Wicket 的组件有自己的 Guice 注入器。所以如果你用 @Inject
注入你的 EmployeeManager
并且你试图尝试注入其他东西,这意味着你注入了两次。这可能会导致这样的问题。
当您添加 @Transactional
注释时,将生成一个代理 class 来处理交易魔法。由于访问限制,代理 class 似乎无法调用 EmployeeManager 构造函数。我会尝试制作构造函数 public.