Spring boot ModelMapping SpringBoot匹配多个源属性层次结构

Spring boot ModelMapping SpringBoot匹配多个源属性层次结构,spring-boot,dto,modelmapper,Spring Boot,Dto,Modelmapper,我面临一个映射实体的问题。 我实际上扩展了我所有的实体,为什么这个类: @MappedSuperclass @Data @EntityListeners(AuditingEntityListener.class) @JsonIgnoreProperties( value = {"logcreatedAt", "logupdatedAt"}, allowGetters = true ) public abstract clas

我面临一个映射实体的问题。 我实际上扩展了我所有的实体,为什么这个类:

@MappedSuperclass
@Data
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(
        value = {"logcreatedAt", "logupdatedAt"},
        allowGetters = true
)
public abstract class AuditModel implements Serializable {
    
    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @Column(name = "log_created_at", nullable = false, updatable = false)
    @CreatedDate
    private Date logCreatedAt = new Date();

    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @Column(name = "log_updated_at", nullable = false)
    @LastModifiedDate
    private Date logUpdatedAt = new Date();
}
我遇到的问题是:

1) The destination property com.example.jpa.dto.HistoriqueDeploiementReadingDTO.setLog_updated_at() matches multiple source property hierarchies:

    com.example.jpa.model.AuditModel.getLogUpdatedAt()
    com.example.jpa.model.AuditModel.getLogCreatedAt()
    com.example.jpa.model.HistoriqueDeploiement.getService()/com.example.jpa.model.AuditModel.getLogUpdatedAt()
    com.example.jpa.model.HistoriqueDeploiement.getService()/com.example.jpa.model.AuditModel.getLogCreatedAt()
    com.example.jpa.model.HistoriqueDeploiement.getNamespace()/com.example.jpa.model.AuditModel.getLogUpdatedAt()
    com.example.jpa.model.HistoriqueDeploiement.getNamespace()/com.example.jpa.model.AuditModel.getLogCreatedAt()
我知道地图绘制者出了什么问题,但我找不到任何解决方案。。。 这个堆栈对我没有任何帮助:

我的地图绘制者:

@Service
@Configuration
@Slf4j
public class MappingHistoriqueToDTO {

    @Autowired
    private HistoriqueDeploiementRepository historiqueDeploiementRepository;
    
    @Autowired
    private ModelMapper modelMapper;

    @Bean
    public ModelMapper modelMapper() {
       ModelMapper modelMapper = new ModelMapper();
       return modelMapper;
    }
    
    public List<HistoriqueDeploiementReadingDTO> findAllMapping() {
       return ((List<HistoriqueDeploiement>) historiqueDeploiementRepository
                .findAll())
                .stream()
                .map(this::convertToHistoriqueDeploiementReadingDTO)
                .collect(Collectors.toList());
    }

    private HistoriqueDeploiementReadingDTO convertToHistoriqueDeploiementReadingDTO(HistoriqueDeploiement historiqueDeploiement) { 
        modelMapper.getConfiguration()
                .setMatchingStrategy(MatchingStrategies.LOOSE);
        HistoriqueDeploiementReadingDTO historiqueDeploiementReadingDTO = modelMapper
                .map(historiqueDeploiement, HistoriqueDeploiementReadingDTO.class); 
        log.info("[Mapping] HistoriqueDeploiement -> HistoriqueDeploiementReadingDTO");
        return historiqueDeploiementReadingDTO;
    }
}
@服务
@配置
@Slf4j
公共类MappingHistoryQueToToToToTo{
@自动连线
私人的历史发展历史的发展;
@自动连线
私有模型映射器模型映射器;
@豆子
公共模型映射器模型映射器(){
ModelMapper ModelMapper=新的ModelMapper();
返回模型映射器;
}
公共列表findAllMapping(){
返回((列表)历史查询开发存储
.findAll())
.stream()
.map(此::ConvertToHistoryQuedeLoviementTreadTo)
.collect(Collectors.toList());
}
私有历史开发到转换到历史开发到(历史开发到历史开发){
modelMapper.getConfiguration()
.设置匹配策略(匹配策略松动);
HistoryQuedeLoiementTreading数据到HistoryQuedeLoiementTreading数据到=模型映射器
.map(历史开发,历史开发到.class);
log.info(“[Mapping]HistoryQueeDevelopment->HistoryQueeDevelopmentTreadingDTO”);
将历史开发记录返回到;
}
}
我希望映射程序从HistoryQueeDevelopment实体而不是从命名空间或服务获取getLogUpdatedAt()的值


谢谢

我通过这样做自己的映射解决了这个问题。 我不再使用modelmapper了

public List<CheckConfigDTO> findAllMapping() {
        log.info("[Mapping] CheckConfig -> CheckConfigDTO");
        return ((List<CheckConfig>) checkConfigRepository
                .findAll())
                .stream()
                .map(this::convertToCheckConfigDTO)
                .collect(Collectors.toList());
    }
    

    private CheckConfigDTO convertToCheckConfigDTO(CheckConfig checkConfig) {       
        CheckConfigDTO checkConfigDTO = new CheckConfigDTO();
        checkConfigDTO.setId(checkConfig.getId());
        checkConfigDTO.setNamespace(checkConfig.getNamespace().getNamespace());
        checkConfigDTO.setService(checkConfig.getService().getService());
        checkConfigDTO.setType_verification(checkConfig.getTypeVerification());
        checkConfigDTO.setStatus(checkConfig.getStatus());
        checkConfigDTO.setStatus_complementaire(checkConfig.getStatusComplementaire());
        checkConfigDTO.setDetails(checkConfig.getDetails());
        checkConfigDTO.setAction_by(checkConfig.getActionBy());     
        checkConfigDTO.setLog_created_at(checkConfig.getLogCreatedAt());
        checkConfigDTO.setLog_updated_at(checkConfig.getLogUpdatedAt());        
        return checkConfigDTO;
    } 

公共列表findAllMapping(){
log.info(“[映射]CheckConfig->CheckConfigDTO”);
返回((列表)checkConfigRepository
.findAll())
.stream()
.map(此::ConvertToCheckConfigTo)
.collect(Collectors.toList());
}
私有CheckConfigDTO convertToCheckConfigDTO(CheckConfig CheckConfig){
CheckConfigDTO CheckConfigDTO=新的CheckConfigDTO();
checkConfigDTO.setId(checkConfig.getId());
checkConfigDTO.setNamespace(checkConfig.getNamespace().getNamespace());
checkConfigDTO.setService(checkConfig.getService().getService());
checkConfigDTO.setType_验证(checkConfig.getTypeVerification());
checkConfigDTO.setStatus(checkConfig.getStatus());
checkConfigDTO.setStatus_complementaire(checkConfig.getStatusComplementaire());
checkConfigDTO.setDetails(checkConfig.getDetails());
checkConfigDTO.setAction_by(checkConfig.getActionBy());
checkConfigDTO.setLog_在(checkConfig.getLogCreatedAt())处创建;
checkConfigDTO.setLog_updated_位于(checkConfig.getLogUpdatedAt());
返回checkConfigDTO;
} 

那么您的
历史开发
扩展了
审核模型
?你能展示一下它和DTO吗?是的,它扩展了这一点,我发现我不是唯一一个有这个问题的人。其他人找到了一个解决方案,但modelmapper自Java8以来就抛出了警告,而且他们的团队(在Java14中测试)还没有对其进行纠正?我发布了我的实际解决方案如果您只提供复制和测试所需的代码而不是所有不相关的代码,那么(压力)可能是一个不错的MM解决方案:)