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

mapstruct如何将实体映射到字符串,并将字符串映射到相应的实体

云宏儒
2023-03-14

我有下面的结构,我想用MapStruct映射这个。

class DTO
{
  private Integer id;
  String comment;
  //getters & setters
}

class ParentEntity
{
  private Integer id;
  CommentEntity comment;
  //getters & setters
}

class CommentEntity
{
  private Integer id;
  private String text;
  //getters & setters
}

@Mapper(componentModel = "spring")
public interface SampleMapper
{
    @Mapping(source = "entity.comment.text", target = "comment")
    public DTO toDTO(final ParentEntity entity);

    @Mapping(source = "dto.comment", target = "comment.text")
    public ParentEntity toEntity(final DTO dto);
}

下面是mapstruct为toDTO方法生成的实现

@Override
public DTO toDTO(ParentEntity entity) {
    if ( entity == null ) {
        return null;
    }    
    DTO dto = new DTO();
    dto.setComment( entityCommentText( entity ) );
    ....................
}

private String entityCommentText(ParentEntity entity) {
    if ( entity == null ) {
        return null;
    }
    Comment comment = entity.getComment();
    if ( comment == null ) {
        return null;
    }
    String text = comment.getText();
    if ( text == null ) {
        return null;
    }
    return text;
}

下面是mapstruct为toEntity方法生成的实现

@Override
public ParentEntity toEntity(DTO dto) {
    if ( dto == null ) {
        return null;
    }

    ParentEntity entity = new ParentEntity();

    entity.setComment( dtoToCommentEntity( dto ) );
    .............
}

protected CommentEntity dtoToCommentEntity(DTO dto) {
    if ( dto == null ) {
        return null;
    }

    CommentEntity commentEntity = new CommentEntity();

    commentEntity.setText( dto.getComment() );

    return commentEntity;
}

我的问题是Todto()方法只在文本不为空时设置注释。但是toentity()方法不检查空文本或空文本。因此,如果我在DTO中获得“comment”:null,它将创建一个新的comment对象并将文本设置为null。如何避免这一点?有人能解释一下这种行为并建议我正确的做法吗?谢了!

共有1个答案

卫弘图
2023-03-14

像这样:

@Mapper(  componentModel = "spring" )
public interface MyMapper {

    @Mapping(source = "entity.comment.text", target = "comment")
    DTO toDTO(final ParentEntity entity);

    // make sure the entire parameter dto is mapped to comment
    @Mapping(source = "dto", target = "comment")
    ParentEntity toEntity(final DTO dto);

    // and MapStruct will select your own implementation
    default CommentEntity dTOToCommentEntity(DTO dTO) {
        if ( dTO == null ) {
            return null;
        }

        CommentEntity commentEntity = null;
        if (  dTO.getComment()!= null  ) {
            commentEntity = new CommentEntity();
            commentEntity.setText( dTO.getComment() );
        }
        return commentEntity;
    }
}
 类似资料:
  • 如何将字符串映射到列表,并将列表映射到字符串? 考虑到我们有以下班级 在Dozer和Orika中,我们可以使用以下代码行轻松映射 如何在MapStruct中进行相同类型的映射?在哪里可以找到有关mapstruct的更多示例?

  • 嗨,我尝试将以下Source类映射到以下Destation类。我使用了以下映射以将字符串值映射到列表字符串。它没有正确映射。我需要知道如何使用Dozer将2个字符串值映射到一个目标字符串列表中。

  • 我是Mapstruct的新手。我有一个Word对象,它包含一个字符串值和一组它自己,我想把它映射到WordDTO,它包含一个值和一组字符串值。我不知道怎么做。正如我在注释中所说,mapstruct不能映射两个对象是有道理的,但如果它有帮助,我将错误放在下面: 我为映射实现了这个接口: 谢谢你的帮助。

  • 问题内容: 当前,我有一堆实现接口的Java类,这意味着它们都具有方法。这个想法是,每个类都有几个(例如<10)成员,并且每个类都通过方法映射到该类中的方法,如下所示: 你明白了。 这对我来说很好,但是现在我需要一个从键到函数的运行时可访问的映射。并非每个函数 实际上都 返回一个String(有些返回void),并且我需要动态地访问每个具有键的类中每个函数的返回类型(使用反射)。我已经有一位经理,

  • 问题内容: 我有一个具有以下结构的JPA实体对象: itemJsonString字段包含json字符串值,例如 并且itemJson字段包含对应的对象,该对象映射到json字符串。 我从数据库中获取此实体对象,如下所示: 现在,itemJson字段为空,因为它是一个瞬态字段。我必须使用Jackson的ObjectMapper手动设置它,如下所示: 我怎样才能做到这一点,当我这样做时,它会返回一个I

  • 问题内容: 当我用Java进行操作时,我在stdout中得到了很好的输出。在不干预标准输出的情况下,如何在变量中获得相同的a字符串表示形式?像什么? 问题答案: 使用。 所有的亦是在此之后是做头套下。地图的格式在中描述。 返回此映射的字符串表示形式。字符串表示形式由键值映射列表组成,这些键值映射由地图视图的迭代器返回,并用大括号(“ {}”)括起来。相邻的映射用字符“,”(逗号和空格)分隔。每个键