seedstack / business

Based on the Domain-Driven-Design approach, the business framework will help you structure and implement your business code cleanly and efficiently.
http://seedstack.org/docs
Mozilla Public License 2.0
27 stars 21 forks source link

FluentAssembler overrides generated aggregate identity #91

Open Magador opened 7 years ago

Magador commented 7 years ago

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.

adrienlauer commented 7 years ago

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.

maneesh-innani commented 6 years ago

Apart from model mapper, can we add support for other mapping tools like dozer?

maneesh-innani commented 6 years ago

Probably we want also to integrate one example , showing directly working with UML stereotypes, like in enterprise architect?

adrienlauer commented 6 years ago

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.