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

时间:2020-11-02 09:57:49

标签: spring-boot dto modelmapper

我在映射实体时遇到问题。 我实际上扩展了我的所有实体,为什么使用此类:

@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()

我了解映射器有什么问题,但是我没有找到解决方案... 这个堆栈根本对我没有帮助:ModelMapper: matches multiple source property hierarchies

我的映射器:

@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;
    }
}

我希望映射器从historiquedeploiement实体而不是命名空间或服务获得getLogUpdatedAt()的值。

谢谢!

1 个答案:

答案 0 :(得分:0)

我通过做自己的映射来解决它。 我不再使用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;
    }