我正在使用mapstruct 1.5.2。我尝试将SaveAccount tDTO对象映射到StripeJava库中的AccountUpdateParams.Company对象。它使用构建器模式。
生成的方法使用了错误的重载方法:生成器有一个String类型的setter和第二个同名的setter,并且是CountyParam枚举类型:
public Builder setName(String name) {
this.name = name;
return this;
}
public Builder setName(EmptyParam name) {
this.name = name;
return this;
}
Mapstruct生成以下实现:
AccountUpdateParams.Company.Builder company = com.stripe.param.AccountUpdateParams.Company.builder();
if ( value.getLegalName() != null ) {
company.setName( Enum.valueOf( EmptyParam.class, value.getLegalName() ) );
}
但是这是错误的,因为我想使用setName(String)setter:
company.setName( value.getLegalName() );
我对这个字段的映射非常简单:
@Mapping(target = "name", source = "legalName")
为什么mapstruct选择将输入String转换为枚举以匹配第二个setter?有没有办法使用String setter?我发现没有办法禁用文档中的隐式类型转换。
我不知道这是否是最好的解决方案,但由于您要求任何方法来解决问题,您可以忽略该属性,并使用带有@AfterMaps注释的方法对其进行映射:
@Mapping(target = "name", ignore = true)
AccountUpdateParams.Company toCompany(SaveAccountDTO saveAccountDTO)
@AfterMapping
default void setNameFromLegalName(SaveAccountDTO saveAccountDTO, @MappingTarget AccountUpdateParams.Company company) {
company.setName( saveAccountDTO.getLegalName() );
}