我正在使用带有Lombok的Map Struct与DTO和实体进行来回映射,但发生在一个案例上:
@Mapper(uses = {RoleMapper.class})
public interface UserMapper {
UserDto userToUserDto(User user);
default User signUpRequestDtoToUser(SignUpRequestDto dto) {
return User.builder()
.roles(dto.roleIds.stream().map(id -> Role.builder().id(id).build()).collect(Collectors.toList()))
.username(dto.getUsername())
.password(dto.getPassword())
.isEnabled(dto.getIsEnabled())
.build();
}
default UserFilter toUserFilter(UserFilterDto dto) {
return UserFilter.builder()
.isEnabled(dto.getIsEnabled())
.username(dto.getUsername())
.roles(
Objects.nonNull(dto.getRoleIds())
? dto.getRoleIds().stream().map(id -> Role.builder().id(id).build()).collect(Collectors.toList())
: Collections.emptyList())
.build();
}
}
[在其他情况下,我正在使用这样的注释:@Mapping(target = "advisor.id", source = "advisorId")
用于从id
创建对象。父级包含一个实例的工作方式。但是User
和UserFilter
具有List<Role>
作为字段。
如何用注释替换default
方法?
从我在您的示例中看到的,我假设您可以在这种情况下很好地使用批注,只需创建一个在RoleId和Role之间进行映射的方法,Mapstruct就会自动调用此方法:
@Mapping(source = "id", target = "id")
default Role mapRoleIdToRole(RoleId roleId);