Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mapstruct-字符串操作,但仅在一个属性上_Java_Spring Boot_Mapstruct - Fatal编程技术网

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,我必须承认我从未使用过它,但它看起来非常有用。再次感谢,我真的很感谢你的评论。