【问题标题】:Injections are stopping after adding @Transactional annotation添加 @Transactional 注释后注入停止
【发布时间】:2017-03-29 12:30:25
【问题描述】:

我创建了一个可以轻松添加和更新员工的类。我在 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 是一个休眠实体类。 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)

【问题讨论】:

    标签: java hibernate dependency-injection transactions guice


    【解决方案1】:

    如果您两次注入EmployeeManager,这可能是问题所在。我猜EmployeeFormComponentWicket Component。 Wicket 的组件有自己的 Guice Injector。因此,如果您将EmployeeManager@Inject 一起注入,并且您也尝试尝试注入其他东西,这意味着您将其注入两次。这可能会导致这样的问题。

    【讨论】:

    • 但它不应该也适用于其他情况,对吧。当我删除 @Transactional 时,尽管它被注入了很多地方,但它仍然有效。
    • 不,你误会了。在不同的地方进行多次注射是可以的。事务性是仅针对该操作发生的事情。检查你是否在组件类中注入了两次。
    • 天哪。我没想到解决方案这么简单。是的,我正在使用另一个注释在 UI 上注入服务。我猜它与检票口冲突。现在它正在工作。
    【解决方案2】:

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

    【讨论】:

    • 同样的问题仍然存在。
    • IllegalAccessError 仍然存在,对吗?
    • 是的,但根本原因是 com.google.inject.ProvisionException: Guice 配置错误。 - 所以原因是组件类中的多次注入。
    猜你喜欢
    • 2013-03-07
    • 2020-12-01
    • 1970-01-01
    • 2013-07-20
    • 2015-10-18
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多