首页 > 解决方案 > 自动装配注释不适用于 @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;
}

标签: javaspring

解决方案


首先,请记住,根据JPA 规范,您不应该(直接或间接地)与调用生命周期方法的相同持久性上下文混淆:

一般来说,可移植应用程序的生命周期方法不应调用 EntityManager 或查询操作、访问其他实体实例或修改同一持久性上下文中的关系 [46]。[47] 生命周期回调方法可以修改调用它的实体的非关系状态。

所以你的电话catalogService.save(orderItem);看起来很可疑。

关于您的主要问题,问题是EntityListener实例是由 JPA 提供程序而不是由 Spring 实例化的,因此您不能直接在其中使用 Spring 好东西。但是,您可以实施一些解决方法,阅读此问题以获取更多详细信息,特别是 Den B 的答案看起来很容易适应您的代码。


推荐阅读