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

MapStruct:如何在MapStruct中从对象的属性构造字符串?

穆浩皛
2023-03-14

我有下面的班级结构。

public class Comment
{
  private Integer id;
  private String text;

  //getters & setters
}

@Mapper(componentModel = "spring")
public interface CommentMapper
{
    String map(Comment comment);
    Comment map(String text);
    //Comment map(String someNameHere);
}
@Override
public String map(Comment comment) {
if ( comment == null ) {
    return null;
}
String string = new String();
return string;
}

@Override
public Comment map(String text) {
if ( text == null ) {
    return null;
}
Comment comment = new Comment();
comment.setText( text );
return comment;
}

/*
@Override
public Comment map(String someNameHere) {
    if ( someNameHere == null ) {
        return null;
    }
    Comment comment = new Comment();
    return comment;
}
*/

问题1:map方法将comment对象作为参数并返回字符串,它只是返回一个空字符串对象,而不是设置字符串的text属性并返回它。为什么?如何返回comment对象的text属性?

问题2:当map方法的参数名为text时,它使用类中的text属性生成实现,否则只生成空的comment对象。我很惊讶地发现mapstruct生成的不同实现也取决于参数名。有什么解释吗?

注意:comment对象在另一个对象中用作属性。在那里我需要上面提到的行为。现在我是这样管理的。@mapping(source=“entity.comment.text”,target=“comment”)@mapping(source=“dto.comment”,target=“comment.text”)

共有1个答案

王君墨
2023-03-14

MapStruct的bugtracker中也存在类似的问题(#584不能创建返回对象为字符串的方法):

MapStruct通常在Java bean上操作,即它期望源和目标对象的属性。对于您的情况,我只需将映射器作为一个抽象类,并从手工实现方法(代码生成实际上不会给您带来任何优势):

String dtoToString(Dto dto) {
    return dto.getField1();
}

然后,其他(生成的)方法可以使用该方法将DTO属性映射到string属性。不用在抽象映射器本身上声明这个手动编写的方法,您还可以在另一个类上声明它,并通过@mapper#use()导入它。

--https://github.com/mapstruct/mapstruct/issues/584#issuecomment-117523614

你现在做的方式很好,我会坚持下去。

 类似资料:
  • 我使用Mapstruct(1.2.0.final)来映射dto对象,我希望将对象的属性提取到它自己的对象实例。 如何做到这一点?或者有没有更方便的方法来去掉只有一个属性的(无用的)对象? 提前谢了。

  • 映射器类如下所示:

  • 我不确定我错过了什么。我的自定义逻辑适用于我为目标指定的所有字符串属性,而不仅仅是一个。 图像映射器: 购物产品映射器: 生成的mapstruct类: 为什么描述字段也与toFullImagePath一起使用? 这个“@Mapping(target=“fullImagePath”,source=“thumbPath”)不应该指定我只想更改fullImagePath吗?

  • 是否有可能映射包的私有属性(不使用lombok)。我们成功地将包私有类映射到DTO,但为了成功映射属性,我们需要它们具有公共getter和setter。 我安慰自己,这个类仍然是包私有的,但在属性之前它是公开的:) 谢谢!亚历克斯。

  • 问题内容: 我有一个bse64encoded字符串,来自外部源(Android商店)的公钥,我需要使用它来验证签名内容。如何将字符串转换为java.security.PublicKey接口的实例。如果这有所作为,我使用Java 6。 密钥是(可能)使用标准的Java库而不是有弹性的城堡生成的(它来自远程团队,所以我不确定)。他们的示例代码说使用Security.generatePublicKey(

  • 我是Mapstruct的新手,我正在努力正确理解它。 我想实现的是从DTO字符串参数(carModel)转换为他的实体,使用服务和存储库进行检索。 问题是Mapstruct生成的Mapper类正在尝试向Service类注入注释,但它不起作用。服务为空。 这是我的课程: 类: 类: DTO和实体类: 构建工作正常,但当我尝试使用Mapper时,应用程序停止。它说carModelService是空的。