MapStruct:如何使我的方法从Long映射到Object?

问题描述 投票:0回答:2

我有一个实体和DTO。

@Entity
@Data
public class GroupParameter {

    @Id
    @GeneratedValue(generator = ID_GENERATOR)
    private Long id;
    private String title;
    private boolean common;
    @ManyToOne
    @JoinColumn(name = "TYPE_REPORT_ID", nullable = false)
    private TypeReport typeReport;

}

@Data
public class GroupParameterIdDTO extends GroupParameterAbstract {

    private Long typeReportId;

}

当我从DTO映射到实体时,我需要将Long typeReportId映射到TypeReport typeReport。

我尝试这样做:

@Mapper(componentModel = "spring")
public abstract class GroupParameterMapper {

    @Autowired
    private TypeReportService typeReportService;

    @Mapping(target = "typeReport", source = "typeReportId", qualifiedByName = "fromLongToTypeReport")
    public abstract GroupParameter fromGroupParameterIdDTO(GroupParameterIdDTO groupParameterIdDTO);

    @Named("fromLongToTypeReport")
    private TypeReport fromLongToTypeReport(Long typeReportId) throws EntityNotFoundException {
        return typeReportService.findById(typeReportId);
    }
}

但是我得到错误:

错误:(23,5)java:无法将属性“ java.lang.Long typeReportId”映射到“ ru.watchlist.domain.TypeReport typeReport”。考虑声明/实现映射方法:“ ru.watchlist.domain.TypeReport map(java.lang.Long value)”。

如何通过按ID在存储库中找到对象,将Long映射到对象?

spring spring-data-jpa entity dto mapstruct
2个回答
0
投票

我已经通过qualifiedByName做到了:

import java.util.List;
@Mapper(componentModel = "spring", uses = { IdTranslator.class})
public interface GroupParameterMapper {

//...

    @Mapping(target = "id", ignore = true)
    @Mapping(target = "typeReport", source ="typeReportId", qualifiedByName = { "idTranslator", "toTypeReport" })
    GroupParameter fromGroupParameterIdDTO(GroupParameterIdDTO groupParameterIdDTO) throws EntityNotFoundException;

//...
}

@Named("IdTranslator")
public class IdTranslator {

    @Autowired
    TypeReportService typeReportService;

    @Named("toTypeReport")
    public TypeReport toTypeReport(Long typeReportId) throws EntityNotFoundException {

        if (typeReportId != null) {
            return typeReportService.findById(typeReportId);
        } else {
            return null;
        }
    }


}

我不知道为什么我应该在类之前使用@Named(因此在官方指南中已完成),因为没有它,它会很好地工作。


0
投票

限定符中使用的所有方法都必须可供实现类访问。当前,fromLongToTypeReport是私有的。您应该将其设置为package-protectedprotectedpublic,它将可以使用。

© www.soinside.com 2019 - 2024. All rights reserved.