Mapstruct - Kotlin -不可变嵌套对象-传播父值



我想做嵌套对象的映射,需要从父对象的值。我可以使用这里提到的解决方案mapstruct——将父字段值传播到嵌套对象的集合——或者直接在映射之后为子对象设置一些值,或者使用上下文。但在我的例子中,我使用不可变对象。

的例子:

data class Worker(
val name: String,
val businessCard: BusinessCard? = null,
)
data class BusinessCard(
val companyName: String,
)
data class WorkerDto(
val name: String,
val businessCard: BusinessCardDto? = null,
)
data class BusinessCardDto(
val text: String, // "worker name | company name"
)

有一种方法如何直接映射值没有@AfterMapping修改?

像这样?

@Mapper(config = CustomMappingConfig::class, uses = [ComputerMapper::class])
abstract class WorkerMapper {
@Mapping(target = "businessCard.text", expression = "java(mapBcText(worker))")
abstract fun mapWorker(worker: Worker): WorkerDto
protected fun mapBcText(worker: Worker) = "${worker.name} | ${worker.businessCard?.companyName}"
}
但遗憾的是,上面的代码生成了:
@Override
public WorkerDto mapWorker(Worker worker) {
if ( worker == null ) {
return null;
}
String name = null;
BusinessCardDto businessCard = null;
name = worker.getName();
businessCard = businessCardToBusinessCardDto( worker.getBusinessCard() );
WorkerDto workerDto = new WorkerDto( name, businessCard );
return workerDto;
}
protected BusinessCardDto businessCardToBusinessCardDto(BusinessCard businessCard) {
if ( businessCard == null ) {
return null;
}
BusinessCardDto businessCardDto = new BusinessCardDto();
businessCardDto.setText( mapBcText(worker) ); // WORKER IS NOT ACCESSIBLE HERE
return businessCardDto;
}

有人知道如何实现这个映射吗?

…我也试图创建自定义的名片映射器,但我不能访问父数据(工人)然后…

你需要在你的数据类中使用var而不是val。

mapstruct目前似乎不能管理不可变的kotlin类。

最新更新