Я, должно быть, здесь что-то делаю не так.
У меня есть очень простое приложение Axon, которое имеет две простые функции: создать человека и изменить имя человека .
Итак, у меня есть Person Entity:
@Entity
@Data
@NoArgsConstructor
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
}
И мой PersonAggregate:
@Aggregate
@Data
@NoArgsConstructor
public class PersonAggregate {
@AggregateIdentifier
private UUID id;
private String name;
@CommandHandler
public PersonAggregate(CreatePersonCommand command) {
apply(new PersonCreatedEvent(
command.getId(),
command.getName()
));
}
@EventSourcingHandler
public void on(PersonCreatedEvent event) {
this.id = event.getId();
this.name = event.getName();
}
@CommandHandler
public void handle(ChangeNameCommand command) {
apply(
new NameChangedEvent(
command.getId(),
command.getName()
)
);
}
@EventSourcingHandler
public void on(NameChangedEvent event) {
this.name = event.getName();
}
}
И это мой ChangeNameCommand:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ChangeNameCommand {
@TargetAggregateIdentifier
private UUID id;
private String name;
}
И это мой NameChangedEvent:
@Value
public class NameChangedEvent {
private final UUID id;
private final String name;
}
и репозиторий:
@Repository
public interface PersonCommandRepository extends JpaRepository<Person, Long> {
}
Проблема заключается в том, что я не уверен, как структурировать мой обработчик событий
@EventHandler
public void changeName(NameChangedEvent event) {
Optional<Person> opt = null;//this.personCommandRepository.findById(event.getId());
if (opt.isPresent()) {
Person person = opt.get();
person.setName(event.getName());
this.personCommandRepository.save(person); //Does'nt this defeat the purpose of Event Sourcing? A single point of truth?
}
А также, в моем контроллере у меня довольно большая проблема, в комментарии:
@RequestMapping(value = "/rename", method = RequestMethod.POST)
public ResponseEntity<?> changeName(@RequestParam("id") Long id, @RequestParam("name")String name){
//1. Which Id do we pass in here? Aggregate or Entity?
//this.commandGateway.send(new ChangeNameCommand(id,name));
return new ResponseEntity<String>("Renamed", HttpStatus.OK);
}
}