Spring boot 2 @Transactional annotation makes Autowired fields null(Spring Boot 2@Transaction批注使自动连接的字段为空)
问题描述
我正尝试在我的服务的方法中使用@Transactional
注释来延迟加载域。但是,在我的实现类上使用@Transactional
会使所有自动绑定的字段null
。
以下是我的实现:
@Service
public class UserServiceImpl implements UserService {
/**
* DefaultMapper.
*/
@Autowired
private DefaultMapper defaultMapper;
/**
* Resource service injection.
*/
@Autowired
private ResourceService resourceService;
/**
* UserRepository.
*/
@Autowired
private UserRepository userRepository;
/**
* Jwt Factory.
*/
@Autowired
private JwtService jwtService;
@Override
@Transactional
public final UserDto findByLogin(final String login) throws ResourceNotFoundException {
// user repository is null here when using @Transactional
User user = this.userRepository.findByLogin(login)
.orElseThrow(() -> new ResourceNotFoundException(
resourceService.getMessage(MessageBundle.EXCEPTION, "resource.notfound.user.login")
));
UserDto userDto = defaultMapper.asUserDtoWithRoles(user);
return userDto;
}
提前谢谢您。
推荐答案
事务是使用AOP应用的,Spring中的默认AOP机制是使用代理。使用Spring Boot时,代理模式设置为基于类的代理。
您可以使用以下两种方法中的一种来解决此问题。
- 从您的方法中删除
final
- 通过将
spring.aop.proxy-target-class=false
添加到application.properties
来禁用基于类的代理
@Transactional
时,这将导致您的UserServiceImpl
的代理被创建,准确地说是基于类的代理。发生的情况是为UserServiceImpl
创建了一个子类,并且所有方法都被覆盖以应用TransactionInterceptor
。但是,由于您的方法被标记为final
,所以动态创建的类不能覆盖此方法。因此,该方法查看动态创建的代理类中的字段实例,该实例始终为null
。
当删除final
方法时,可以重写该方法,应用该行为,并且它将查看正确的字段实例(实际UserServiceImpl
而不是代理)。
禁用基于类的代理时,您将获得一个JDK动态代理,它基本上是一个实现服务实现的所有接口的瘦包装。它应用添加的行为(事务)并调用实际服务。不需要对实际类进行扩展,因此您可以代理最终方法(只要它是您的接口的一部分)。
这篇关于Spring Boot 2@Transaction批注使自动连接的字段为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Spring Boot 2@Transaction批注使自动连接的字段为空
基础教程推荐
- 降序排序:Java Map 2022-01-01
- “未找到匹配项"使用 matcher 的 group 方法时 2022-01-01
- Java:带有char数组的println给出乱码 2022-01-01
- 在 Libgdx 中处理屏幕的正确方法 2022-01-01
- 如何使用 Java 创建 X509 证书? 2022-01-01
- FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1 2022-01-01
- 减少 JVM 暂停时间 >1 秒使用 UseConcMarkSweepGC 2022-01-01
- Java Keytool 导入证书后出错,"keytool error: java.io.FileNotFoundException &拒绝访问" 2022-01-01
- 设置 bean 时出现 Nullpointerexception 2022-01-01
- 无法使用修饰符“public final"访问 java.util.Ha 2022-01-01