Java Springbean以编程方式注册不支持事务

Java Springbean以编程方式注册不支持事务,java,spring,rollback,Java,Spring,Rollback,我的项目使用模板服务模式 我尝试了两种方法 一是使用@autowired注释。 然后,设置我的参数 第二,使用AutowireCapableBeanFactory。以编程方式创建ServiceTemplate,然后创建autowireBean 我的服务模板类是 public class ServiceTemplate<T>{ public ServiceTemplate(){} public ServiceTmeplate(T clazz, ...){ ...} @Transacti

我的项目使用模板服务模式

我尝试了两种方法

一是使用@autowired注释。 然后,设置我的参数

第二,使用AutowireCapableBeanFactory。以编程方式创建ServiceTemplate,然后创建autowireBean

我的服务模板类是

public class ServiceTemplate<T>{
public ServiceTemplate(){}
public ServiceTmeplate(T clazz, ...){
...}
@Transactional
public Response someMethod(){
 try{
...}
catch{
 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
}
公共类服务模板{
公共服务模板(){}
公共服务模板(T clazz,…){
...}
@交易的
公众回应方法(){
试一试{
...}
抓住{
TransactionSpectSupport.currentTransactionStatus().setRollbackOnly()
}
在我的控制器上,代码是

@Autowired
private AutowireCapableBeanFactory beanfactory

public Resonse getTest(){
final ServiceTemplate<testClass> serviceTemplate = new ServiceTemplate<>(.....)
beanfactory.autowireBean(seviceTemplate)
}
@Autowired
专用自动连线功能beanfactory beanfactory
公共响应测试(){
最终ServiceTemplate ServiceTemplate=新ServiceTemplate(…)
autowireBean(服务模板)
}
在我的第一种方法中,它是有效的。它是回滚所有事务


但是我想采用第二种方法。如何以编程方式在事务管理器下创建我的bean。

第二种方法无法工作,因为您的
ServiceTemplate
是自我管理的,因此spring无法将您的bean代理为事务性关注点。这里只有依赖项由spring管理和自动连接

解决方案是使用编程事务

类服务模板{
@自动连线
私有平台transactionManager transactionManager;
私有事务模板TransactionTemplate;
公众回应方法(){
//
transactionTemplate.execute(状态->
{
//此方法中的代码在事务上下文中执行
}
});
//
}

非常感谢您的帮助!