我目前正在为一个项目创建一个REST-API,并且正在阅读关于最佳实践的文章.许多人似乎反对DTO,只是暴露域模型,而其他人似乎认为DTO(或用户模型或任何你想称之为的)是不好的做法.就个人而言,我认为这篇文章很有意义.
但是,我也理解DTO的缺点,包括所有额外的映射代码,可能与其DTO对应物100%相同的域模型等等.
我们的API主要是为了让其他客户端可以使用数据而创建的,但是如果我们做得对,我们也希望尽可能将它用于我们自己的Web GUI.
问题是我们可能不希望将所有域数据公开给其他客户端用户.大部分数据只在我们自己的Web应用程序中才有意义.此外,我们可能不希望在所有方案中公开有关对象的所有数据,尤其是与其他对象的关系等.例如,如果我们公开特定对象的列表,我们不一定要暴露整个对象层次结构; 这样对象的孩子就不会暴露,但可以通过链接(hateoas)发现.
我该如何解决这个问题?我正在考虑在我们的域模型上使用Jackson mixins来控制在给定不同场景的情况下会暴露哪些数据.或者我们应该一直使用DTO - 即使考虑到它的缺点和争议?
我在 Spring Boot、Spring Data 和外部 jar 中有实体时遇到了一些问题。任何帮助将不胜感激!
我的 Sprint 数据存储库如下所示:
@Repository
public interface MyFileRepository extends PagingAndSortingRepository<MyFile, Long> {
@Modifying
@Transactional
@Query("Delete from MyFile f where f.created < ?1")
long deleteOldEntities(Date cutoffDate);
}
Run Code Online (Sandbox Code Playgroud)
我在另一个罐子里的实体完全是这样的:
@Entity
@SequenceGenerator(
name = "SequenceIdGenerator",
sequenceName = "SEQ_ID_MY_FILE",
allocationSize = 20
)
@Table(
name = "MYFILE_TABLE"
)
public class MyFile extends BaseEntity {
private long id;
private byte[] data;
[...]
public MyFile() {}
@Id
@Column(
name = "id",
nullable = false
)
@GeneratedValue(
generator = "SequenceIdGenerator"
) …Run Code Online (Sandbox Code Playgroud)