Spring Data JPA @DomainEvents 发布领域事件以及遇到的坑。

news2024/11/17 16:03:10

文章目录

    • 发布领域事件
    • 监听领域事件
    • 遇到的问题

发布领域事件

通过repositories管理的实体是聚合根。在领域驱动设计(DDD)的应用中,这些聚合根通常会发布领域事件。Spring Data提供了一个名为@DomainEvents的注解,可以在聚合根的一个方法上使用该注解,就可以非常方便的发布领域事件了。如下所示:

@Entity
class Person {
    private Long id;
    private String name;
    private int age;

    @Transient
    private final transient List<PersonEvent> domainEvents = new ArrayList();

    /**
	* 	使用 @DomainEvents 的方法可以返回一个单一的事件实例或一个事件的集合。
	*	它必须不接受任何参数。
	*/
    @DomainEvents
    Collection<PersonEvent> domainEvents() {
        return domainEvents;
    }

    /**
	* 在所有的事件都被发布后,可以使用@AfterDomainEventPublication注释的方法
    * 清理要发布的事件列表(除其他用途外)。
	*/
    @AfterDomainEventPublication 
    void callbackMethod() {
       domainEvents.clear();
    }

    public void saveDomainEvent(){
        domainEvents.add(new PersonSaveEvent(this));
    }

    public void deleteDomainEvent(){
        domainEvents.add(new PersonDeleteEvent(this));
    }
}

每次调用Spring Data Repository 的save(...)saveAll(...)delete(...)deleteAll(...)方法时都会调用这些方法,也就是增/删/改都会触发领域事件。

监听领域事件

使用注解 @TransactionalEventListener 来监听领域事件,如下所示为监听PersonSaveEvent事件

@Async
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void savePersonEvent(PersonSaveEvent saveEvent){
    this.doSomething(saveEvent.getPerson());
}

遇到的问题

  1. DomainEvents 方法不能使用 Arrays.asList 返回集合,会报错。
    Spring JPA @DomainEvents,从聚合根发布领域事件以及遇到的坑
    Spring JPA @DomainEvents,从聚合根发布领域事件以及遇到的坑。

出错原因:
Arrays.asList返回的集合是 Arrays 的内部类 ArrayList,查看源码发现ArrayList本身是没有实现remove方法的,所以会调用其父类 AbstractList remove 方法。
AbstractList 其实也没有实现 remove 方法,而是直接抛出个异常,也就是上面坑里抛出的错误。

  1. 直接在@DomainEvents标注的方法内创建指定类型事件。导致删除时也会调用saveEvent逻辑。
    Spring JPA @DomainEvents,从聚合根发布领域事件以及遇到的坑。
    Spring官方文档明确标注有-> 每次调用Spring Data Repository 的save(...)saveAll(...)delete(...)deleteAll(...)方法时都会触发领域事件。所以在domainEvents方法中根本就不能明确当前触发的到底是什么事件(创建 or 删除?)。

如需源码,请私信或留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JD青龙面板任务代理池部署与使用教程

JD脚本中一些任务会黑ip 导致没法跑或者跑不出东西 比如联盟跑出来全是劵 这时候就需要代理池 本文为3步 1.购买设置代理 2.部署代理池 3.脚本配置代理池 使用效果展示 1.设置代理 代理推荐购买星空 点我查看星空代理 按下图购买及生成API API填入部署的配置中(下文有说)…

ThinkPHP 之 SQLI审计分析(三)

说明 该文章来源于徒弟lu2ker转载至此处&#xff0c;更多文章可参考&#xff1a;https://github.com/lu2ker/ 文章目录说明0x00 测试代码做了什么0x01 分析调用链0x03 总结Time&#xff1a;9-23影响版本&#xff1a;ThinkPHP5.1.22 Payload&#xff1a; /public/index.php/i…

万物皆可集成系列:低代码对接微信小程序

近年来&#xff0c;微信小程序的开发如火如荼&#xff0c;很多移动端应用为了更方便被大家所使用的&#xff0c;都步入了小程序的行列 那么对于低代码平台开发的移动端应用是否可以和小程序集成呢&#xff1f;这里我以微信小程序为例。为大家介绍如何在 首先&#xff0c;众所…

ELF格式学习

ELF格式学习 一、简介 ELF的英文全称是Executable and Linking Format&#xff0c;最初是由UNIX系统实验室开发、发布的ABI(Application Binary Interface)接口的一部分&#xff0c;也是Linux的主要可执行文件格式。 ELF文件种类&#xff1a; 可执行文件&#xff08;.out&a…

内核解读之内存管理(1)CPU体系架构UMA和NUMA

文章目录1. SMP&#xff08;UMA&#xff09; 体系架构2. NUMA 体系架构3. NUMA 结构基本概念内存和cpu有着密不可分的联系&#xff0c;学习内存管理&#xff0c;先了解下cpu的架构。1. SMP&#xff08;UMA&#xff09; 体系架构 CPU 计算平台体系架构分为 SMP 体系架构和 NUMA…

【Kotlin】函数 ② ( Unit 函数 | TODO 函数抛出异常返回 Nothing 类型 | 反引号函数名 )

文章目录一、Unit 函数二、TODO 函数抛出异常返回 Nothing 类型三、反引号函数名一、Unit 函数 Java 语言 中 没有返回值的函数 其 返回类型 是 void ; Kotlin 语言 中 没有返回值的函数 其返回类型是 Unit , 该函数又称为 Unit 函数 ; Kotlin 语言中 推出 Unit 类型概念 , 是…

电子产品拆解分析-暖手宝

①电子产品拆解分析-暖手宝一、功能介绍二、拆解电路分析以及器件作用1、暖手宝整体电路2、锂电池充电升压电路根据数据手册以及电路实物绘画原理图3、控制PTC加热垫换挡电路根据实物绘画原理图4、主控MUC电路三、各模块对应的原理图一、功能介绍 ①按键三档调温暖手&#xff1…

如何站在开发者的角度理解框架的设计思想?

感谢支持 我已经在CSDN发布了100多篇原创文章&#xff0c;如果你读过我的文章&#xff0c;欢迎点击下方的链接&#xff0c;帮我五星评价一下&#xff0c;谢谢。 很简单&#xff0c;点击下图&#xff0c;像截图一样五星评价一下就可以了&#xff1a; 有问必答 最近有好多读者…

Vue(六)

1. 列表渲染&#xff08;接五&#xff09; 1.1 Vue监测数据的原理—数组 修改数组&#xff1a;最后追加元素&#xff1a;push&#xff1b;删除最后一个元素&#xff1a;pop&#xff1b;删除第一个元素&#xff1a;shift&#xff1b;在最前面加一个&#xff1a;unshift;在指定位…

shell之函数和数组练习案例

目录函数和数组练习案例1、编写函数&#xff0c;实现打印绿色OK和红色FAILED判断是否有参数&#xff0c;存在为Ok&#xff0c;不存在为FAILED2、编写函数&#xff0c;实现判断是否无位置参数&#xff0c;如无参数&#xff0c;提示错误3、编写函数实现两个数字做为参数&#xff…

ArcGIS基础实验操作100例--实验46按要素融合多边形

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验46 按要素融合多边形 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

ctf中linux内核态的漏洞挖掘与利用系列1

说明 该系列文章主要是从ctf比赛入手&#xff0c;针对linux内核上的漏洞分析、挖掘与利用做讲解&#xff0c;本篇文章主要介绍内核漏洞利用所需的前置知识以及准备工作。 linux内核态与用户态的区别 以 Intel CPU 为例&#xff0c;按照权限级别划分&#xff0c;Intel把 CPU指…

8.JS笔记-函数

1.函数 函数是封装了一段可以被重复执行调用的代码块。目的是让大量代码重复使用 封装&#xff1a;将一个或多个功能通过函数的方式进行封装&#xff0c;对外只提供一个简单的函数接口&#xff08;将主板、CPU等封到主机里&#xff09; 2.函数使用 2.1 声明函数 function 函…

DHCP自动分配IP命令配置

由路由器R3充当服务器给PC3和PC4分配IP地址&#xff1a; [r3] dhcp enable-----开启DHCP服务器 [r3] ip pool ? STRING<1-64> Pool name [r3] ip pool aaa-----创建地址池&#xff08;aaa是地址池的名字&#xff09; [r3-ip-pool-aaa]network 192.168.4.0 mask 24-----…

【C进阶】C语言终话,了解计算机的程序环境和预处理过程

目录 &#x1f3c2;前言&#x1f3c2;&#xff1a; &#x1f3c7;一、详解编译与链接&#x1f3c7;&#xff1a; 1.程序的翻译环境与执行环境&#xff1a; 2.翻译环境&#xff1a; 3.翻译阶段&#xff1a; ①.编译&#xff1a; ②.链接&#xff1a; 4.运行环境&#xff1a; …

Java 并发编程 (一)Semaphore和Exchanger的使用

Semaphore和Exchanger的使用 Semaphore 功能介绍 Semaphore 主要作用就是限制线程并发数量。 Semaphore 的构造函数中permits 可以控制最大并发数。每个线程可以acquire指定数量的 permit 。但是acquire n个 则需要释放n个。防止被阻塞 public class MySemaphore {// permits…

【python】鞭炮快乐响,春联贴门上,祝福送到你身旁

前言 大家早好、午好、晚好吖 ❤ ~ 现在贴春联已成风俗&#xff0c;红色的对联贴在大门上&#xff0c;房子顿时生辉。 正如诗云&#xff1a;“喜气临门红色妍&#xff0c;家家户户贴春联&#xff1b;旧年辞别迎新岁&#xff0c;时序车轮总向前。” 今天&#xff0c;我们就用p…

静态路由的拓展配置

静态路由的拓展配置&#xff1a; 1、负载均衡 当路由器访问同一个目标具有多条开销相似的路径&#xff08;经过路由器的数量&#xff09;时&#xff0c;可以让流量拆分后沿多条路径同时传输&#xff0c;可以达到叠加带宽的效果。&#xff08;当开销不相似时做负载均衡&#xff…

数据可视化系列-03AIPL消费者行为全链路可视化模型实践

文章目录4.AIPL消费者行为全链路可视化模型实践4.1、用户画像用户画像产生的原因用户画像概述用户画像构成原则第一类用户画像 User Persona第二类用户画像User Profile4.2、标签体系标签体系简介标签分类贴标签的方式标签的优化用户画像标签和权重4.3、用户画像大数据应用4.4、…

USB基础

一 USB 芯片组成 同以太网类似&#xff0c;USB芯片也分为Controller部分(主机控制器/设备控制器)和PHY部分(收发器) 两大部分组成。 Controller部分 主要实现USB的协议和控制&#xff0c;内部逻辑主要有 MAC层&#xff0c;CSR层&#xff0c;FIFO层等。 MAC层实现安装USB协议…