我通常在DTO中实现方法以将它们转换为实体.我这样做是因为我的目标是尽可能保持实体代码的整洁.然而,我收到的反馈建议,对于实体来说,接受DTO作为参数并创建实体更自然.我读了how to convert DTO to/from Entity号文章,但我读的时候也不是很理解.
DTO
public record MemberRegistRequestDto(
@NotBlank String oauthId,
@NotBlank String oauthPlatform,
@NotBlank String name,
@NotBlank String profileImg,
@NotBlank String nickname,
@NotNull int birth,
@NotBlank String gender,
@NotBlank String profession,
@NotBlank String signatureColor,
@NotBlank String contentType
) {
public Member of() {
return Member.builder()
.oauthId(oauthId)
.oauthPlatform(getOAuthProviderFromString(oauthPlatform))
.name(name)
.profileImg(profileImg)
.nickname(nickname)
.birth(birth)
.gender(gender)
.profession(profession)
.signatureColor(signatureColor)
.profileImg(profileImg)
.build();
}
...
}
实体
@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@Table(indexes = @Index(name = "oauth_id", columnList = "oauthId", unique = true))
public class Member extends BaseTimeEntity implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.ID实体)
private Long id;
@Column(nullable = false)
private String oauthId;
@Enumerated(EnumType.STRING)
private OAuthProvider oauthPlatform;
@Column(nullable = false)
private String name;
private String profileImg;
@Column(nullable = false)
private String nickname;
private Integer birth;
private String gender;
private String profession;
@Column(nullable = false)
private String signatureColor;
// 로그인 정보 식별 값, 프로필 사진, 필명, 이름, 성별, 생년월일, 이메일
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
private List<Adate> adates;
...
}
将DTO转换为实体(服务层)
@Transactional
public void registMember(MemberRegistRequestDto memberRegistRequestDto) {
Member member = memberRegistRequestDto.of();
memberRepository.save(member);
}
建议让实体接受DTO作为参数.
var member = Member.of(memberRegistRequestDto);
- 哪一层最好?控制器或服务我实现了控制器将DTO传递给服务并将其接收回来的模式.这是因为我将控制器视为接收来自用户的输入并将其传递给服务的层.
我读了很多关于Stack Overflow的文章,但我还不能很好地理解它们.
我读过的文章: