I am working on a project for my class. Need to map DTO to Entity and vice versa. My DTO does not have an Id field and conversion is happening at Controller Layer. 2 other classes are extending my entity, thus @Superbuilder.
My conversion Entity -> DTO works fine with ModelMapper
But DTO -> Entity does not. The commented line in convertToEntity I thought should work, but nope kept getting the infamous ' has non-private no-argument constructor '. Spent hours trying to fix. Decided to go with a simpler solution, though really wanted to make ModelMapper work.
If any of you could help me find a fix, I would really appreciate it. Thanks in advance for your time and responses.
======My DTO=====
@Value
@Jacksonized
@Builder
@AllArgsConstructor
public class UserMetaData {
@NotNull @NotBlank @NotEmpty(message = "First name cannot be empty!")
@JsonProperty("firstName")
String firstName;
@NotNull @NotBlank @NotEmpty(message = "Last name cannot be empty!")
@JsonProperty("lastName")
String lastName;
@Max(value = 110, message = "Invalid age!") @Min(value = 16, message = "Must be older than 16!")
@JsonProperty("age")
int age;
@NotNull
@JsonProperty("privilege")
Privilege privilege;
//@NotNull
@JsonProperty("alias")
String alias;
//@Singular
@JsonProperty("groups")
Set<Group> groups;
}
=====My Entity=====
@Document(collection = "Users")
@SuperBuilder
@Data
@RequiredArgsConstructor(onConstructor = @__(@PersistenceConstructor))
public class Member implements User {
@Id
protected final UUID id;
protected final String firstName;
protected final String lastName;
protected final int age;
@Builder.Default
protected final Privilege privilege = NONE;
protected String alias;
protected Set<Group> groups;
protected Set<Group> addGroup(Group group) {
this.groups.add(group);
return this.groups;
}
}
=====Bean for ModelMapper=====
@Bean
public ModelMapper modelMapper() {
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration()
.setFieldMatchingEnabled(true)
.setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE);
return modelMapper;
}
=====Converters=====
private UserMetaData convertToDTO(Member member) {
return modelMapper.map(member, UserMetaData.UserMetaDataBuilder.class)
.build();
}
private Member convertToEntity(UserMetaData dto) {
// return modelMapper.map(dto, Member.MemberBuilder.class).id(UUID.randomUUID()).build();
return Member.builder()
.id(UUID.randomUUID())
.firstName(dto.getFirstName())
.lastName(dto.getLastName())
.age(dto.getAge())
.build();
}