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

Spring MapStruct:如何使我的方法从Long映射到Object?,spring,spring-data-jpa,entity,dto,mapstruct,Spring,Spring Data Jpa,Entity,Dto,Mapstruct,我有一个实体和它的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", nullabl

我有一个实体和它的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映射到实体时,我需要将长typeReportId映射到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。考虑声明/实现映射方法:R.WistList.Dopay.TyPePrimeMavjava. Lang.Load Value.<
如何通过在存储库中按Id查找对象来将Long映射到Object?

我使用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,所以这是在官方指南中完成的,因为如果没有它,效果会很好。

限定符中使用的所有方法都需要实现类可以访问。目前,fromLongToTypeReport是私有的。你应该让它包保护,保护或公开,它会工作

在侧节点上,不必使用限定符在Long和TypeRecord之间进行映射。您只需定义这样的方法,MapStruct就可以进行映射

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

    @Autowired
    private TypeReportService typeReportService;

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

    protected TypeReport fromLongToTypeReport(Long typeReportId) throws EntityNotFoundException {
        return typeReportService.findById(typeReportId);
    }
}

你必须修正你的代码,稍微改变源代码的值。MapStruct读取映射方法中参数的名称:

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

    @Autowired
    private TypeReportService typeReportService;

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

    @Named("fromLongToTypeReport")
    private TypeReport fromLongToTypeReport(GroupParameterIdDTO groupParameterIdDTO) throws EntityNotFoundException {
        return typeReportService.findById(groupParameterIdDTO.getTypeReportId());
    }
}

你不应该真的需要@Named。问题在于私有方法。看我的回答,我错了。它说com.darioxlz.bookings.application.mapper.in.BookingRequestMapperImpl中的FieldMemberTranslator需要一个类型为“com.darioxlz.bookings.application.mapper.in.memberTranslator”的bean,但找不到。您构建了它吗?我很肯定,它不起作用。如果您只将GroupParameterAddTo参数传递给MapStruct,那么MapStruct将如何找到名为typeReportId的源代码。老实说,我没有尝试我编写的代码。不过,我很有信心它能起作用。当存在单个源参数时,源中的参数名称是可选的。在本例中,您可以直接从源参数typeReportId写入属性。这对你不管用吗?另外,我是项目负责人,也是MapStruct的维护者之一。我想说的是:您的解决方案比我的解决方案更清晰,如下所示:谢谢