【发布时间】:2021-11-17 13:39:50
【问题描述】:
我想将我的 DTO (CreateOrUpdatePostRequest) 映射到我的实体 Post。
但我不知道该怎么做,因为我的实体有这样的关系:
@Entity
@Table(name = "POSTS")
@Data
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "post_id")
private int id;
private String title;
private String description;
@Temporal(TemporalType.DATE)
@Column(name = "expire_at")
private Calendar expireAt;
@ManyToOne
@JoinColumn(name = "CATEGORY_ID")
private Category category;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "TAG_POST", joinColumns = {
@JoinColumn(name = "post_id", nullable = false, updatable = false) },
inverseJoinColumns = { @JoinColumn(name = "tag_id",
nullable = false, updatable = false) })
private Set<Tag> tags = new HashSet<Tag>(0);
}
一篇文章可以有一个类别和多个标签。
这是我的 DTO:
@Data
public class CreateOrUpdatePostRequest {
@NotNull
@Size(min = 10, max = 30)
private Sting title;
@NotNull
@Size(min = 50, max = 600)
private String description
@NotNull
@ValidDateString
private String expireAt;
@NotNull
private Category category;
@NotNull
private List<TagDTO> tags;
public List<Integer> getTagIds() {
return this.getTags().stream().map(TagDTO::getId).collect(Collectors.toList());
}
}
问题:我的问题是我必须为某些属性应用特定的映射逻辑,以确保标签有效,例如:
post.setTags(tagService.findAllByIds(request.getTagIds()));
-
所以我想应该在我的
PostService中完成映射,知道我必须访问tagService?我的意思是我不能真正在我的CreateOrUpdateRequest中创建toEntity方法。 -
有没有办法保留所有属性的默认 ModelMapper 行为,但使用外部服务为某些属性指定特定行为?
-
如果我的 DTO 内部有一个 DTO 需要与上述相同的行为,例如在
TagDTO中,如何继续?
【问题讨论】:
-
只需创建类/服务,它将您的 dto 转换为实体,或在实体内添加一个函数,该函数可以基于 DTO 创建此实体(可能类似于构建器类或其他东西)
标签: java spring modelmapper