FluentAssembler overrides generated aggregate identity
Suppose a Person aggregate and DTO :
public class Person extends BaseAggregateRoot<UUID> {
@Identity(handler = UUIDHandler.class)
private UUID id;
private String name;
}
public class PersonDTO {
private UUID id;
private String name;
}
In a standard workflow, we would create a PersonDTO without id in a interface and send it to the server. The server would then merge it into a freshly created aggregate :
fluentAssembler.merge(personDTO).into(Person.class).fromFactory();
The default factory will create a UUID as identity with the IdentityService, but when the actual mapping will happen, the null value of the DTO's id will override the generated id of the aggregate.
One workaround is to call the identity service again after the merge.
The best solution, I think, is to configure ModelMapper to ignore nulls:
modelMapper.getConfiguration().setPropertyCondition(Conditions.isNotNull());
I think that this behavior is highly desirable and should be the default. I will take this into account when making ModelMapper assemblers configurable in business framework 4.0.
Apart from model mapper, can we add support for other mapping tools like dozer?
Probably we want also to integrate one example , showing directly working with UML stereotypes, like in enterprise architect?
ModelMapper was refactored as an add-on (https://search.maven.org/artifact/org.seedstack.addons.modelmapper/modelmapper/1.0.0/jar) so the same can be done for Dozer, quite easily.
I'm not having much time to work on this but if you have some time to contribute it, I would be delighted. I can setup the repository and the release process for the new add-on if you want to start on this.