Spring Autowiring 失败,@Transactional

标签 spring jpa proxy-classes

我想在 UserService(concrete class) 的 save() 方法中使用 @Transactional 注释,如下所示:

@Service
public class UserService {

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

}

我将通过 Autowiring 在 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" />

请让我知道我的代码有什么问题?

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

最佳答案

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

@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 Autowiring 失败,@Transactional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32579118/

相关文章:

java - MappingException : Repeated column in mapping for entity: . .. 列: dept_id (应使用 insert ="false"update ="false"进行映射)

java - 提交后数据库未更新()

由于 WSDL 中存在多个同名类型,WCF 生成的代理抛出 InvalidOperationException

php - 构建 'simple' php url 代理

spring - CRSF LazyCsrfTokenRepository 如何工作?

spring - 当我们可以使用接口(interface)实现松散耦合的代码时,为什么还要使用 Spring 框架呢?

Spring Cloud Stream RabbitMQ

java - 如何在 XML 配置中注入(inject) Autowired beans?

java - JPA getSingleResult() 或 null

java - @Cacheable 打破 DependencyInjection