使用@Transactional进行弹簧自动装配失败

时间:2015-09-15 06:27:49

标签: spring jpa proxy-classes

我想在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" />

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

我是否需要设置代理?

1 个答案:

答案 0 :(得分:2)

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

@Service
public class UserService implements SomeInterface {

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

}


public class MyRealm extends AuthorizingRealm {

@Autowired
private SomeInterface userService;

}

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