java - 在私有方法中保存实体
问题描述
我有一个Ingestion
公开单个方法的类ingest
。此方法处理传入表单的每个部分(第 1 部分、第 2 部分等)。
我对每个部分都有私有方法,在实体处理过程中保存它。我知道这@Transactional
对私有方法没有影响,但是我不想公开这些方法,但想使用@Transactional
提供的功能。
我希望确保每个部分都独立完成Transaction
;我可以通过“AspectJ”(正如其他 SO 答案所建议的那样)而不是 Spring 的开箱即用实现来做到这一点,但我试图避免由于它会导致系统范围的变化。
对另一种方法有任何想法吗?
下面提供的伪代码给出了类结构的一般概念:
public Class Ingestion {
// Autowired Repo's
...
...
@Transactional
public void ingest(Form form){
this.processSection1(form);
this.processSection2(form);
this.processSection3(form);
}
@Transactional
private void processSection1(Form form){
// do specific section 1 logic
section1Repo.save(form);
}
@Transactional
private void processSection2(Form form){
// do specific section2 logic
section2Repo.save(form);
}
@Transactional
private void processSection3(Form form){
// do specific section3 logic
section3Repo.save(form);
}
}
==================================================== ======================= 这不是评论中标记的重复问题。我知道@Transactional
不适用于私有方法。我的问题更多的是“我们如何在不使用 AspectJ 的情况下解决这个 Spring AOP 问题”
解决方案
这不起作用的原因是注释之类的@Transactional
添加了额外的功能,这些功能被包装实际对象的 Spring 代理对象拦截。但是,当您使用关键字在对象上调用私有方法时this
,您将直接访问真实对象并绕过代理。
解决此问题的一种方法是@Autowire
将对象放入自身,并通过该自动装配变量进行事务调用。您仍然可以通过这种方式访问私有方法,并且调用将是 Spring 管理的代理而不是裸对象。
推荐阅读
- asp.net-core - 如何使用 asp-for 获取模型的完整命名空间路径
- excel - 什么是“禁用宏”错误弹出窗口?我可以用它代替 msgbox 吗?
- c# - 在 Microsft Graph 中调用并显示 List memberOf 的结果
- c++ - 为什么当我使用双精度时,Qt<->Matlab 正确写入和读取我的字节,但对于存储 uint32 的字节却不正确?
- c# - 如何从 HttpClient 实例获取会话 ID?
- spring-boot - 创建测试数据时出现 NullPointerException
- react-native - 如何从屏幕组件访问 createStackNavigator 中定义的默认路由参数
- video-streaming - 有没有办法识别流视频的编解码器?
- ios - Swift/Regex:如何使用 stringByReplacingMatches(withTemplate) 格式化字符串?
- reactjs - 流类型和多态性