【问题标题】:advising all delete and save methods in spring-data-jpa建议 spring-data-jpa 中的所有删除和保存方法
【发布时间】:2015-07-29 05:49:16
【问题描述】:

我有一个要求,我需要建议所有删除和保存方法,并将删除/保存的记录发送到其他地方。

我正在使用具有

的JpaRepository
  • 6 次删除
  • 3 次保存

基本上我需要建议所有这些方法。问题是它们中的每一个都有不同的方法签名和返回类型,有时接受 Long、Object 或 List。我正在考虑使用方面来实现这一点,但它似乎很讨厌,因为我目前有 4 个需要审核的对象涉及 4 x 9 = 36 个不同的切入点。还有更多这样的产品,所以很快就会达到数百个。

有没有更好的办法?

【问题讨论】:

  • 您是否考虑过使用 JPA EntityListeners? java2s.com/Tutorial/Java/0355__JPA/… 它们可以挂接到 JPA 实体生命周期的各个点,例如 Pre/Post-Persist/Update/Delete。
  • 这看起来可能是要走的路,但是,我需要访问 spring bean 来发送 JMS 消息。我想知道这是否可以使用@EntityListeners。
  • 只是一个提议:如果您不能通过 JPA 侦听器或类似方法解决您的问题,请分享一些代码(例如各种方法名称和签名),那么也许我可以建议一个基于方面的解决方案。不过,为此目的设计的车载框架装置可能更可取。

标签: spring spring-boot aspectj spring-data-jpa


【解决方案1】:

我按照@sheltem 的建议让它工作了。我使用了实体监听器。就我而言,我需要访问一个 spring bean 并且能够以这种方式访问​​它:

@Component
public class PublishEntityListener {

    private static PublishingService publishingService;

    @Autowired(
            required = true)
    public void setPublishingService(PublishingService publishingService) {
        this.publishingService = publishingService;
    }

    @PostConstruct
    public void init() {
        //Allow the static dependency to be setup post construct as @EntityListeners are no spring managed
    }

    @PostPersist
    public void prePersist(DomainObject<?> entity) {
        publishingService.publish(getTopicName(entity), HttpMethod.POST, entity);
    }

    @PostUpdate
    public void preUpdate(DomainObject<?> entity) {
        publishingService.publish(getTopicName(entity), HttpMethod.PUT, entity);
    }

    @PostRemove
    public void onDelete(DomainObject<?> entity) {
        publishingService.publish(getTopicName(entity), HttpMethod.DELETE, entity);
    }

}

【讨论】:

  • 我想知道为什么没有人支持这个答案。我认为他们像我一样迷失在aop中。让我们等到一切都来了。
猜你喜欢
  • 2021-11-09
  • 2018-06-25
  • 2018-09-25
  • 2019-12-20
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
相关资源
最近更新 更多