添加@Transactional注释后停止注射

时间:2017-03-29 12:30:25

标签: java hibernate dependency-injection transactions guice

我创建了一个易于添加和更新Employees的类。我在createEmployee方法中添加了@Transactional注释,然后当我尝试检索数据时,我的实例开始出错。

    @Transactional
    @Override
    public void createEmployee(Employee employee) {
        internalCreateEmployee(employee);
    }

没有@Transactional一切正常但我可以将任何内容保存到数据库中。当我添加这个注释时,我收到了这个错误。

  

java.lang.IllegalAccessError:尝试访问方法   rd.EmployeeManagerImpl(Lrd./EmployeeDao;Lrd./DepartmentDao):V   来自类rd.EmployeeManagerImpl $$ EnhancerByGuice $$ 5db9fd74

在EmployeemanagerImpl中我也在构造函数中注入了我的DAO对象。

    @Inject
    EmployeeManagerImpl(EmployeeDao employeeDao, DepartmentDao departmentDao){
        this.employeeDao = employeeDao;
        this.departmentDao = departmentDao;
    }

@Transactional打破事情的原因是什么?

我只是不知道需要提供哪些信息,如果您需要任何进一步的信息,请询问。

注意:Employee是一个hibernate实体类。 EmployeeDaoDepartmentDaoEmployeeManagerImpl都有@Singleton注释。

注意2:在堆栈跟踪中,似乎无法初始化EmployeeManager实例。

com.google.inject.internal.InjectorImpl$4.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$1.<init>(EmployeeAddModalWindow.java:20)
    rd.EmployeeAddModalWindow.<init>(EmployeeAddModalWindow.java:20)
    rd.ManageEmployeePage$1.<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)

2 个答案:

答案 0 :(得分:3)

如果您注射EmployeeManager两次可能是问题。我猜EmployeeFormComponentWicket Component。 Wicket的组件有自己的Guice Injector。因此,如果您使用EmployeeManager注入@Inject,并且如果您尝试注入其他内容,则表示您注入了两次。这可能会导致类似的问题。

答案 1 :(得分:3)

添加@Transactional注释时,将生成代理类来处理事务魔术。由于访问限制,似乎代理类无法调用EmployeeManager构造函数。我会尝试将构造函数设为公开。

相关问题