java Spring没有为具有带@Transactional annotation的公共方法的Spring Service创建代理对象

a2mppw5e  于 2023-06-04  发布在  Java
关注(0)|答案(1)|浏览(103)

我有一个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类)扩展,注入,代理正在创建,并且所有这些类都在同一个基本包中。

k10s72fa

k10s72fa1#

第一个提到可能重复的评论帮助我前进。我将构造函数注入改为字段注入,并添加了@Lazy,它开始工作了。更多信息可以在这里找到:

相关问题