如何使用JHipster在mapstruct中映射对象引用?

时间:2018-07-27 15:27:57

标签: jhipster mapstruct

假设您使用这样的JDL脚本为带有帖子的博客创建了一个JHipster应用,并且您希望拥有一个BlogDTO来显示其中的帖子(以及一个BlogDTO来显示每个帖子具有的评论):

entity Blog {
    creationDate Instant required
    title String minlength(2) maxlength(100) required
}

entity Post {
    creationDate Instant required
    headline String minlength(2) maxlength(100) required
    bodytext String minlength(2) maxlength(1000) required
    image ImageBlob
}

entity Comment {
    creationDate Instant required
    commentText String minlength(2) maxlength(1000) required
}


// RELATIONSHIPS:
relationship OneToMany {
    Blog to Post{blog required}
    Post{comment} to Comment{post(headline) required}
}

// Set pagination options
paginate all with pagination

// DTOs for all
dto * with mapstruct

// Set service options to all except few
service all with serviceClass

// Filtering
filter *

Jhipster将使用其DTO创建Blog,Post和Comment实体,并假设您不希望在Blog中填充Posts或在Posts中添加评论,因此BlogMapper如下所示:

@Mapper(componentModel = "spring", uses = {})
public interface BlogMapper extends EntityMapper<BlogDTO, Blog> {

    @Mapping(target = "posts", ignore = true)
    Blog toEntity(BlogDTO blogDTO);


    default Blog fromId(Long id) {
        if (id == null) {
            return null;
        }
        Blog blog = new Blog();
        blog.setId(id);
        return blog;
    }
}

使用类似BlogDTO的

public class BlogDTO implements Serializable {

    private Long id;

    @NotNull
    private Instant creationDate;

    @NotNull
    @Size(min = 2, max = 100)
    private String title;
//GETTERS, SETTERS, HASHCODE, EQUALS & TOSTRING

任何人都可以帮助修改代码,以便BlogDTO将显示帖子(而PostDTO将显示评论)。谢谢

PD:因为我更改了注释以包括PostMapper类 @Mapper(componentModel =“ spring”,使用= {PostMapper.class})

然后将@Mapping(target =“ posts”,ignore = false)设置为FALSE,但它不起作用。 API示例(Swagger)看起来不错,但是PostDTO为空(即使有数据也是如此)。

1 个答案:

答案 0 :(得分:1)

Set<PostDTO> posts;添加到BlogDTO,并将Set<CommentDTO> comments;添加到PostDTO。还要在DTO文件中为这些字段添加getter和setter。然后在您的映射器中,确保BlogMapper使用PostMapper,并且PostMapper使用CommentMapper。

您可能还需要在Blog.java的posts字段和Post.java的comments字段上配置缓存注释以适合您的用例。使用NONSTRICT_READ_WRITE时,更新缓存可能会有所延迟,从而导致API返回过时的数据。