当前位置: 首页 > 知识库问答 >
问题:

Mapstruct-字符串操作,但仅对一个属性执行

潘意
2023-03-14

我不确定我错过了什么。我的自定义逻辑适用于我为目标指定的所有字符串属性,而不仅仅是一个。

@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吗?

共有1个答案

秦滨海
2023-03-14

这不是它的工作原理。

定义映射时,Mapstruct将主要基于属性名称约定,尝试将源对象中的每个属性映射到目标对象。

当您定义一个@映射注释时,您是在指示这个基本映射的异常。

在您的示例中,当您定义以下内容时:

@Mapping(target = "fullImagePath", source = "thumbPath")

您指示源对象中的属性thumbPath应映射到目标对象中的fullImagePath:这是必要的,因为它们具有不同的名称,否则映射将无法成功。

另一方面,当定义时,使用=ImagePathMapper。class属性您正在指示Mapstruct将定义为某个类的每个属性转换为源对象中的String类型:只要ShopProduct中定义的所有字段都是Strings,此映射器将应用于每个属性。

如果只想为一个字段应用映射器,可以调用自定义映射方法,或使用decorator,或前后映射注释,如以下示例所示:

java prettyprint-override">@Mapper(componentModel = "spring", uses=AppConfig.class, injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public abstract class ShopProductMapper {

  abstract ShopProductDTO shopProductToShopProductDTO(ShopProduct shopProduct);

  @Autowired
  public void setAppConfig(AppConfig appConfig) {
    this.appConfig = appConfig;
  }

  @AfterMapping
  public void toFullImagePath(@MappingTarget ShopProductDTO shopProductDTO, ShopProduct shopProduct) {
    String thumbPath = shopProduct.getThumbPath();
    if (thumbPath != null) {
      shopProductDTO.setFullImagePath(appConfig.getImagePath() + thumbPath);
    }
  }
}

请注意,在示例中,您需要对映射器进行几个更改才能正常使用Spring:请参阅此和此。

 类似资料:
  • 我有下面的班级结构。 问题1:方法将对象作为参数并返回字符串,它只是返回一个空字符串对象,而不是设置字符串的属性并返回它。为什么?如何返回对象的属性? 问题2:当map方法的参数名为时,它使用类中的属性生成实现,否则只生成空的对象。我很惊讶地发现mapstruct生成的不同实现也取决于参数名。有什么解释吗? 注意:对象在另一个对象中用作属性。在那里我需要上面提到的行为。现在我是这样管理的。@map

  • 我想对字符串执行子字符串操作。我有字符串<代码> 我尝试了finame=mainname。子字符串(0,mainname.lastIndexOf(“.”) 但我得到了<代码>

  • 问题内容: 我在python中有一个字符串元素列表,想用来编辑元素中的每个元素,所以我有一个新元素。请参见下面的代码(它不起作用,但是您会明白的): 有没有办法做到这一点? 问题答案:

  • 问题内容: 在python 2.6中,我想对每个字典值执行一个运算,例如,我想对每个字典值乘以2。如何为该任务减少编码? 问题答案:

  • 本文向大家介绍C#通过属性名字符串获取、设置对象属性值操作示例,包括了C#通过属性名字符串获取、设置对象属性值操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#通过属性名字符串获取、设置对象属性值操作.分享给大家供大家参考,具体如下: #通过反射获取对象属性值并设置属性值 0、定义一个类 1、通过属性名(字符串)获取对象属性值 2、通过属性名(字符串)设置对象属性值 #获取对象的

  • 前言 忙活了一个礼拜,终于等到周末,可以空下来写点东西。 之前已经完成《数值运算》和《布尔运算》,这次轮到介绍字符串操作 。咱们先得弄明白两个内容: 什么是字符串? 对字符串有哪些操作? 下面是"在线新华字典"的解释: 字符串:简称“串”。有限字符的序列。数据元素为字符的线性表,是一种数据的逻辑结构。在计算机中可有不同的存储结构。在串上可进行求子串、插入字符、删除字符、置换字符等运算。 而字符呢?