MapStruct使用基于输入参数的嵌套映射器



在这个简单的场景中,我有一支有颜色的钢笔。我想根据笔映射器中的变量输入,使用嵌套映射器方法而不是另一种方法来映射笔的颜色。

颜色实体:

public class ColorEntity {
private Long colorId;
private String colorName;
}

笔实体:

public class PenEntity {
private Long penId;
private String penArticle;
private ColorEntity color;
}

彩色DTO:

public class ColorDTO {
private Long colorId;
private String colorName;
}

笔DTO:

public class PenDTO {
private Long penId;
private String penArticle;
private ColorDTO color;
}

颜色映射器:如果我调用ColorMapper.toDto(color, locale),应该使用第二种方法。

@Mapper(componentModel = "spring")
public interface ColorMapper {

ColorDTO toDto(ColorEntity colorEntity);

default ColorDTO toDto(ColorEntity colorEntity, Locale locale) {
ColorDTO colorDTO = toDto(colorEntity);

if(locale.equals(Locale.ITALIAN)) {
colorDTO.setColorName("ROSSO");
}
else {
colorDTO.setColorName("Language not supported");
}

return colorDTO;
}
}

笔映射器:与ColorMapper相同,如果我调用PenMapper.toDto(pen, locale),则应使用第二种方法。

@Mapper(componentModel = "spring", uses = {ColorMapper.class})
public interface PenMapper {

PenDTO toDto(PenEntity penEntity);

PenDTO toDto(PenEntity penEntity, Locale locale);
}

问题是在生成的PenMapperImpl中,方法public PenDTO toDto(PenEntity penEntity, Locale locale)没有使用方法ColorMapper.toDto(color, locale)来翻译颜色。

@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2021-04-21T17:33:22+0200",
comments = "version: 1.4.2.Final, compiler: Eclipse JDT (IDE) 1.3.1200.v20200916-0645, environment: Java 15.0.2 (Oracle Corporation)"
)
@Component
public class PenMapperImpl implements PenMapper {
@Autowired
private ColorMapper colorMapper;
@Override
public PenDTO toDto(PenEntity penEntity) {
if ( penEntity == null ) {
return null;
}
PenDTO penDTO = new PenDTO();
penDTO.setColor( colorMapper.toDto( penEntity.getColor() ) );
penDTO.setPenArticle( penEntity.getPenArticle() );
penDTO.setPenId( penEntity.getPenId() );
return penDTO;
}
@Override
public PenDTO toDto(PenEntity penEntity, Locale locale) {
if ( penEntity == null && locale == null ) {
return null;
}
PenDTO penDTO = new PenDTO();
if ( penEntity != null ) {
// HERE SHOULD BE GENERATED THE 
// penDTO.setColor( colorMapper.toDto( penEntity.getColor() , locale ) );
penDTO.setColor( colorMapper.toDto( penEntity.getColor() ) );
penDTO.setPenArticle( penEntity.getPenArticle() );
penDTO.setPenId( penEntity.getPenId() );
}
return penDTO;
}
}

我该如何解决此问题?我正在寻找一个通用的解决方案(在这种情况下不是双关语(,因为我在一个项目中有很多类似的情况。

感谢并问候

在其他映射器中查找方法时,MapStruct不使用输入参数。

为了实现这一点,您需要向MapStruct提供一些帮助。

这样做的方法是使用@Context。使用该MapStruct会将其传播到其他映射器。

所以在你的情况下,它看起来像:

@Mapper(componentModel = "spring")
public interface ColorMapper {

ColorDTO toDto(ColorEntity colorEntity);

default ColorDTO toDto(ColorEntity colorEntity, @Context Locale locale) {
ColorDTO colorDTO = toDto(colorEntity);

if(locale.equals(Locale.ITALIAN)) {
colorDTO.setColorName("ROSSO");
}
else {
colorDTO.setColorName("Language not supported");
}

return colorDTO;
}
}
@Mapper(componentModel = "spring", uses = {ColorMapper.class})
public interface PenMapper {

PenDTO toDto(PenEntity penEntity);

PenDTO toDto(PenEntity penEntity, @Context Locale locale);
}

这样,当将toDtoLocale上下文一起使用时,MapStruct将选择ColorMapper#toDtoLocale

相关内容

  • 没有找到相关文章

最新更新