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();
}