【问题标题】:How to target an attribute of a Dto, when mapping a List of entities to a List of dto entities, via an expression or custom method当通过表达式或自定义方法将实体列表映射到 dto 实体列表时,如何定位 Dto 的属性
【发布时间】:2021-06-16 14:42:13
【问题描述】:

在我的映射器类中,我有一个映射器,它将单个资源对象映射到 resourceDto。同样在 resourceDto 中,我有一个名为 favoured 的属性,它是通过 isResourceFavoured 方法手动映射的。

我有另一个映射器,它将资源列表映射到 resourceDtos 列表。

现在,我希望此方法通过自定义表达式为每个 resourceDto 映射偏好的属性,例如将单个资源的 isResourceFavoured 方法映射到 resourceDto 方法。

这怎么可能?可能是自动生成的注释,其中 Lists 的 resourceToResourceDto 方法使用相同的方法,但针对单个对象?

@Mapping(target = "courseId", source = "resource.course.id")
@Mapping(target = "favoured", expression = "java(isResourceFavoured(resource, userId))")
public abstract ResourceDto resourceToResourceDto(Resource resource, Long userId);

@Mapping(target = "courseId", source = "course.id")
public abstract List<ResourceDto> resourceToResourceDto(List<Resource> resources);

public boolean isResourceFavoured(Resource resource, Long userId) {
    ApplicationUser user = userService.findApplicationUserById(userId);
    return resourceService.isFavoured(resource, user);
}

【问题讨论】:

  • 你的 ResourceDto 是否有 userId 的属性?
  • 不,我通过身份验证变量将来自 Endpoint 的 userId 传递给映射器

标签: spring spring-boot jpa mapstruct mapper


【解决方案1】:

当使用带有多个参数的映射方法时,例如ResourceDto resourceToResourceDto(Resource, Long),那么集合映射方法将无法使用它们。为了简化这一点,您可以使用@Context 源参数。

使用@Context 告诉 MapStruct 这些参数应该按原样传递给其他映射方法、生命周期、对象工厂方法等。

在您的示例中,您的映射器可能如下所示:

@Mapper
public abstract class ResourceMapper {

    // Service injected somehow

    @Mapping(target = "courseId", source = "resource.course.id")
    @Mapping(target = "favoured", source = "resource")
    public abstract ResourceDto resourceToResourceDto(Resource resource, @Context Long userId);

    public abstract List<ResourceDto> resourceToResourceDto(List<Resource> resources, @Context Long userId);

    public boolean isResourceFavoured(Resource resource, @Context Long userId) {
        ApplicationUser user = userService.findApplicationUserById(userId);
        return resourceService.isFavoured(resource, user);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2018-09-13
    • 1970-01-01
    相关资源
    最近更新 更多