当前位置: 首页 > 知识库问答 >
问题:

IncompatibleAggregateException(Axon Framework:应用事件后,聚合标识符必须为非空值)

邓鸿雪
2023-03-14

我尝试用Axon配置cqrs和事件源。SeatReseveCreateCommand工作正常。但是SeatReserveUpadateCommand工作不正确。

这是我的SeatReserve集合

@Aggregate
public class SeatReserve {
    @AggregateIdentifier
    private String id;
    private String seatid;
    private Date date;

    @SuppressWarnings("unused")
    private SeatReserve() {
    }

    @CommandHandler
    public SeatReserve(SeatReseveCreateCommand seatReseveCreateCommand) {
        apply(new SeatReseveCreateEvent(seatReseveCreateCommand.getMyid(), seatReseveCreateCommand.getSeatId(),
                seatReseveCreateCommand.getDate()));
    }

    @CommandHandler
    public SeatReserve(SeatReserveUpadateCommand upadateCommand) {
        apply(new SeatReserveUpadateEvent(id, upadateCommand.getSeatId()));
    }

    @EventSourcingHandler
    public void on(SeatReseveCreateEvent seatReseveCreateEvent) {
        this.id = seatReseveCreateEvent.getId();
        this.seatid = seatReseveCreateEvent.getSeatId();
        this.date = seatReseveCreateEvent.getDate();
    }

    @EventSourcingHandler
    public void on(SeatReserveChangeEvent upadateEvent) {
        seatid = upadateEvent.getSeatId();
    }

}

这是我的控制器

@RestController
public class TestController {

    private final CommandGateway commandGateway;

    public TestController(CommandGateway commandGateway) {
        this.commandGateway=commandGateway;
    }

    @PostMapping
    public String fileComplaint(@RequestBody Map<String, String> request) {
        String id = UUID.randomUUID().toString();
        SeatReseveCreateCommand command=new SeatReseveCreateCommand(id,request.get("seatid"),new Date(request.get("date")));
        commandGateway.send(command);
        return id;   
    }
    @PatchMapping
    public String fileComplaintUpdate(@RequestBody Map<String, String> request) {
        SeatReserveUpadateCommand command= new SeatReserveUpadateCommand(request.get("id"),request.get("seatid"));
        commandGateway.send(command);
        return request.get("id");
    }
}

更新导致此错误

2018-01-03 10:44:53.608  WARN 11138 --- [nio-8085-exec-1] o.a.c.gateway.DefaultCommandGateway      : Command 'com.thamira.research.api.bankaccount.SeatReserveUpadateCommand' resulted in org.axonframework.eventsourcing.IncompatibleAggregateException(Aggregate identifier must be non-null after applying an event. Make sure the aggregate identifier is initialized at the latest when handling the creation event.)

我怎么解决这个。

共有1个答案

席宜修
2023-03-14

问题是您的update命令被定义为构造函数。该命令应转到已存在的聚合实例。

将命令处理程序更改为:

@CommandHandler
public void handle(SeatReserveUpadateCommand upadateCommand) {...}

应该能解决问题。

 类似资料:
  • 使用axon框架我有一个错误: 应用事件后,聚合标识符必须是非空的。确保在处理创建事件时最迟初始化了聚合标识符。我使用这个StorageEngine:

  • 我已经升级到Xcode 7,突然我的一个目标无法使用“宏名称必须是标识符”消息构建。此目标的调试配置构建正常,我可以在设备上运行它,但发布配置不会构建。 错误指向目标的.pch文件,但对于许多其他目标(包括已发布的目标),相同的.pch文件构建正常。 以下是错误消息: 这是。pch文件: 我已经尝试过清理和Xcode重启。 我将非常感谢任何关于如何深入挖掘并找到问题所在的建议。

  • 我正在使用SODA for Java存储和检索Oracle12c DB中的文档。我正在效仿这个例子。 这一例外背后的原因将是什么?

  • 问题内容: 我正在尝试在Jenkins / Hudson上配置我的电子邮件,并且不断收到错误消息: 我已经在网上看到了大量有关该错误的信息,但是我没有得到任何帮助。我在Fedora Linux(不是OpenJDK)上使用Sun的JDK。 这是我尝试过的一些方法。我试着从以下这个建议后,但复制从Windows的cacerts到托管詹金斯没有工作,我的Fedora箱。我尝试按照本指南进行操作,因为我试

  • 我正在学习Java 8,在Java的归约运算部分。util。stream的包摘要,它说: 更正式地说,标识值必须是组合器函数的标识。这意味着对于所有u,组合器。应用(恒等式,u)等于u。此外,组合器函数必须是关联的,并且必须与累加器函数兼容:对于所有u和t,组合器。应用(u,累加器。应用(恒等式,t))必须等于累加器()。应用(u,t)。 我不明白为什么身份值必须是组合器函数的身份。我认为“组合器