在这个简单的场景中,我有一支有颜色的钢笔。我想根据笔映射器中的变量输入,使用嵌套映射器方法而不是另一种方法来映射笔的颜色。
颜色实体:
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提供一些帮助。
这样做的方法是使用@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);
}
这样,当将toDto
与Locale
上下文一起使用时,MapStruct将选择ColorMapper#toDto
与Locale
。