Java mapstruct:如何从对象';mapstruct中的属性?

Java mapstruct:如何从对象';mapstruct中的属性?,java,mapstruct,Java,Mapstruct,我有下面的班级结构 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); //Comme

我有下面的班级结构

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);
}
下面是mapstruct生成的实现

@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: 使用
Comment
对象作为参数并返回字符串的
map
方法只是返回一个空字符串对象,而不是在字符串上设置
text
属性并返回它。为什么?以及如何获取返回的
comment
对象的
text
属性

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

注:
注释
对象用作另一个对象内的属性。在那里,我需要上述行为。现在我用这种方式管理它。 @映射(source=“entity.comment.text”,target=“comment”)
@映射(source=“dto.comment”,target=“comment.text”)

在MapStruct的bugtracker()中有一个类似于您的问题:

MapStruct通常在JavaBean上运行,即它需要源对象和目标对象上的属性。对于您的情况,我只是将映射器设置为一个抽象类,并直接实现该方法(代码生成实际上不会给您带来任何好处):

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

--


我知道你目前的工作方式很好,我会坚持下去。

你的具体要求是什么?commentDTO在哪里?没有commentDTO。正如我在另一个DTO中所说,注释只是一个字符串。我只想在文本不为null的情况下使用用户发送的文本创建一个comment对象。我希望注释字符串由注释对象的text属性填充。MapStruct是关于bean映射的。字符串不是Bean。是的,您需要编写自己的映射来映射上面提到的“to-a-String”。“from-a-String”MapStruct可以在映射方法中映射源参数(您有多个),而不是bean属性。它们可以在
@Mapping
注释中用名称表示。如果未提供
@Mapping
,则MapStruct使用基于名称的映射。参数在方法中称为“text”,在注释#text中称为目标属性,因此MapStruct进行映射。如果将“blah”作为参数名,则不会。
String dtoToString(Dto dto) {
    return dto.getField1();
}