Java Mapstruct-字符串操作,但仅在一个属性上
我不确定我错过了什么。我的自定义逻辑适用于我为目标指定的所有字符串属性,而不仅仅是一个Java Mapstruct-字符串操作,但仅在一个属性上,java,spring-boot,mapstruct,Java,Spring Boot,Mapstruct,我不确定我错过了什么。我的自定义逻辑适用于我为目标指定的所有字符串属性,而不仅仅是一个 @ApiModel(value="ShopProduct") @Data public class ShopProductDTO { private String description; private String fullImagePath; } @Entity @Table(name = "shop_product") public class
@ApiModel(value="ShopProduct")
@Data
public class ShopProductDTO {
private String description;
private String fullImagePath;
}
@Entity
@Table(name = "shop_product")
public class ShopProduct implements Serializable {
@Column(name = "desc")
private String description;
@Column(name = "thumb_path")
private String thumbPath;
//getters,setters
图像映射器:
@Component
public class ImagePathMapper {
AppConfig appConfig;
public ImagePathMapper(AppConfig appConfig) {
this.appConfig = appConfig;
}
public String toFullImagePath(String thumbPath){
return appConfig.getImagePath() + thumbPath;
}
}
购物者产品映射器:
@Mapper(componentModel = "spring", uses = {ImagePathMapper.class})
@Component
public interface ShopProductMapper {
@Mapping(target = "fullImagePath", source = "thumbPath")
ShopProductDTO shopProductToShopProductDTO(ShopProduct shopProduct);
}
生成的mapstruct类:
ShopProductDTO shopProductDTO = new ShopProductDTO();
shopProductDTO.setDescription( imagePathMapper.toFullImagePath( shopProduct.getName() ) );
shopProductDTO.setFullImagePath( imagePathMapper.toFullImagePath( shopProduct.getThumbPath() ) );
}
为什么描述字段也与toFullImagePath一起使用
这个“@Mapping(target=“fullImagePath”,source=“thumbPath”)”不应该指定我只想更改fullImagePath吗?这不是它的工作方式 定义映射时,Mapstruct将尝试将源对象中的每个属性映射到目标对象,主要基于 定义
@Mapping
注释时,表示此基本映射的例外情况
在您的示例中,定义此项时:
映射(target=“fullImagePath”,source=“thumbPath”)
您指示源对象中的属性thumbPath
应映射到目标对象中的fullImagePath
:这是必要的,因为它们具有不同的名称,否则映射将无法成功
另一方面,当您定义uses=ImagePathMapper.class
属性时,您指示Mapstruct将定义为特定class
类型的每个属性转换为String
,在这种情况下,在源对象中找到:只要ShopProduct
中定义的所有字段都是String
s,此映射器将应用于每个属性
如果只想为一个字段应用映射器,可以调用、或使用或,如以下示例所示:
@Mapper(componentModel=“spring”,使用=AppConfig.class,injectionStrategy=injectionStrategy.CONSTRUCTOR)
公共抽象类ShopProductMapper{
摘要ShopProduct到ShopProducttoShopProducttoShopProduct(ShopProduct-ShopProduct);
@自动连线
public void setAppConfig(AppConfig AppConfig){
this.appConfig=appConfig;
}
@后映射
public void toFullImagePath(@MappingTarget ShopProductDTO ShopProductDTO,ShopProduct ShopProduct){
字符串thumbPath=shopProduct.getThumbPath();
if(thumbPath!=null){
shopProductDTO.setFullImagePath(appConfig.getImagePath()+thumbPath);
}
}
}
请注意,在本例中,您需要对映射器进行一些更改,才能正确使用Spring:请参阅和。感谢您的详细解释。很好!不客气,洛斯米!我很高兴听到这个答案很有帮助。@jccampanero这也可以通过
@Named
和使用qualifiedByName
进行映射来实现。非常感谢@Filip,我必须承认我从未使用过它,但它看起来非常有用。再次感谢,我真的很感谢你的评论。