Spring MapStruct:如何使我的方法从Long映射到Object?
我有一个实体和它的DTOSpring 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
@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的维护者之一。我想说的是:您的解决方案比我的解决方案更清晰,如下所示:谢谢