java - 自动装配注释不适用于 @PostLoad
问题描述
我想用它来使用目录服务来操作存储库中的数据,但是 Autowired 注释没有注入依赖项。
@Service
public class PostEntityListener {
@PostLoad
public <T> void onPrePersist(T obj) {
if (obj != null) {
String type = obj.getClass().getSimpleName();
switch (type) {
case "Order":
break;
case "OrderItem":
try {
OrderItem orderItem = (OrderItem) obj;
if (orderItem != null) {
catalogService.save(orderItem);
}
} catch (Exception e) {
e.printStackTrace();
}
break;
default:
break;
}
}
}
@Autowired
private CatalogService catalogService;
}
这是我的CatalogService
详细信息:
public interface CatalogService {
void save(OrderItem orderItem);
}
@Service
public class CatalogServiceImpl implements CatalogService {
public void save(OrderItem orderItem) {
catalogRepository.save(orderItem);
}
@Autowired
private CatalogRepository catalogRepository;
}
解决方案
首先,请记住,根据JPA 规范,您不应该(直接或间接地)与调用生命周期方法的相同持久性上下文混淆:
一般来说,可移植应用程序的生命周期方法不应调用 EntityManager 或查询操作、访问其他实体实例或修改同一持久性上下文中的关系 [46]。[47] 生命周期回调方法可以修改调用它的实体的非关系状态。
所以你的电话catalogService.save(orderItem);
看起来很可疑。
关于您的主要问题,问题是EntityListener
实例是由 JPA 提供程序而不是由 Spring 实例化的,因此您不能直接在其中使用 Spring 好东西。但是,您可以实施一些解决方法,阅读此问题以获取更多详细信息,特别是 Den B 的答案看起来很容易适应您的代码。
推荐阅读
- javascript - 手风琴菜单下拉菜单仅适用于第一个下拉菜单
- c# - 如何在sql数据库中加载和显示图像
- flutter - 如何在颤动中创建圆形标签栏?
- javascript - Mui v5.0.4 makeStyles, withStyles 不会对 mui 组件应用样式
- server-administration - 如何启用戴尔 iDRAC
- javascript - Promises:结合单个解析方法和 Promise.all()
- java - 如何在java中用逗号分隔我的输出
- r - R:venn.diagram 字体大小相当于 ggplot2
- asp.net - IBindableControl.ExtractValue 是否也被调用用于深层嵌套的用户控件?
- amazon-web-services - 除非代码发生变化,否则不会触发 lambda 函数