【问题标题】:spring autowiring fails with @Transactional春季自动装配失败,@Transactional
【发布时间】:2015-12-11 07:11:50
【问题描述】:

我想在UserService(具体类)的save()方法中使用@Transactional注解如下:

@Service
public class UserService {

    @Transactional
    public Long save(User userCommand, BindingResult result) {
    ...
    }

}

我将通过自动装配在 MyRealm 中使用此服务。

public class MyRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

}

但是,它失败并出现以下错误:

java.lang.IllegalArgumentException: Can not set n.r.c.s.user.UserService field n.r.c.s.realm.MyRealm.userService to com.sun.proxy.$Proxy48

当然,如果我删除 @Transational 注释,它会起作用。

我的事务管理器设置如下:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

请告诉我我的代码有什么问题?

我需要设置代理之类的东西吗?

【问题讨论】:

  • 我想,MyRealm 或 AuthorizingReal 是 spring bean 吗?您是否打算在事务管理器中使用 mode=aspectj
  • 将此行添加到您的 spring-conf &lt;tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="false" /&gt; ,但您仍然确定 MyRealm 是上下文感知的吗?
  • 那是你的实际UserService 还是你在上面定义了一些接口?
  • @Koitoer,MyRealm 具有“组件”注释,以便将“自动装配”作为 Spring bean 启用。
  • @AntJavaDev 我把你提到的选项,但它没有任何区别。我仍然很困惑。 :(

标签: spring jpa proxy-classes


【解决方案1】:

启用代理后,您需要使用接口,而不是实现。

@Service
public class UserService implements SomeInterface {

@Transactional
public Long save(User userCommand, BindingResult result) {
...
}

}


public class MyRealm extends AuthorizingRealm {

@Autowired
private SomeInterface userService;

}

如果您不想这样做,您可以随时检查您的 AOP 配置。您可能正在某处为代理做代理。

【讨论】:

  • 不是按照定义... Spring 也可以处理基于类的代理。
  • 是的,是的,我知道,这就是我添加最后一行的原因。当我写它的时候,我得到了你的评论。不过你肯定注意到我忘记了。
  • @szefuf 我创建了一个接口UserService,它有多个方法声明,我用方法定义实现了UserServiceImpl。我放了Transactional注解,还是不行。
  • @szefuf 你的回答是正确的。这是我的错,因为我使用 Eclipse“重构”菜单将UserService 重命名为UserServiceImpl。它也使所有引用都被替换了。这就是为什么我仍然声明UserServiceImp,具体类。谢谢。
猜你喜欢
  • 2015-09-18
  • 2019-08-02
  • 2017-12-13
  • 2020-02-02
  • 1970-01-01
  • 2016-12-13
  • 2021-06-10
  • 2013-04-26
  • 1970-01-01
相关资源
最近更新 更多