我有一个RestController,它有一个带有公共方法的Service,注解为@Transactional
。RestController类使用@RestController
进行注解,服务bean使用构造函数注入进行注入。您可以假设服务是作为不同的公共类编写的。MyRespository
使用@Repository
注解进行注解。
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.transaction.Transactional;
@RestController
@RequiredArgsConstructor
public class MyController {
private final MyService myService;
@PatchMapping("/some-endpoint")
public SomeCustomObject updateSomeObject(){
// This prints `package.x.y.z.MyService` as opposed to something like `package.x.y.z.MyService$$EnhancerBySpringCGLIB$$a1b2c3d4`
log.info("myService proxy {}", myService.getClass());
return myService.updateSomeObject();
}
}
@Service
@RequiredArgsConstructor
public class MyService extends SomeBaseService{
private final MyRepository myRepository;
@Transactional(rollbackOn = SomeCustomException.class)
public SomeCustomObject updateSomeObject(){
log.info("Is Transaction Active {} Name {} ", TransactionSynchronizationManager.isActualTransactionActive(),
TransactionSynchronizationManager.getCurrentTransactionName()); // This prints `false` and `null`
SomeCustomObject someCustomObject = getTheObj();
updateTheObject(someCustomObject);
} // Updates are not persisted to the database.
private SomeCustomObject getTheObj(){
return myRepository.HugeMethodNameThatsWhyUsedAMethodAsWrapper();
}
private void updateTheObject(SomeCustomObject someCustomObject){
myRepository.setSomething(someCustomObject);
}
}
在谷歌上,我发现如果存在循环依赖,Spring可能无法创建代理。所以我尝试使用@Autowired
进行Field注入,日志输出仍然显示真实的对象。
在具有另一个服务的其他控制器之一中,该服务也从SomeBaseService
(如MyService
类)扩展,注入,代理正在创建,并且所有这些类都在同一个基本包中。
1条答案
按热度按时间k10s72fa1#
第一个提到可能重复的评论帮助我前进。我将构造函数注入改为字段注入,并添加了
@Lazy
,它开始工作了。更多信息可以在这里找到: