Spring Data REST在不使用DTO的情况下通过REST资源公开实体是否有问题?

时间:2016-08-10 13:24:07

标签: spring rest spring-data domain-driven-design spring-data-rest

在我有限的经验中,我一再被告知你不应该将实体传递到前端或通过休息,而是使用DTO。

Spring Data Rest不是这样做的吗?我简要介绍了一些预测,但这些似乎只是限制了返回的数据,并且仍然期望一个实体作为post方法的参数来保存到数据库中。我在这里遗漏了什么,或者我(和我的同事)是不正确的,因为你不应该传递和实体?

2 个答案:

答案 0 :(得分:3)

Spring Data REST支持一种非常快速的方法来创建基于数据库结构的REST API。与其他编程技术相比,我们在谈论分钟与天数。

您为此付出的代价是您的REST API与您的数据库结构紧密耦合。有时,这是一个大问题。有时它不是。这主要取决于数据库设计的质量以及您根据API用户需求进行更改的能力。

简而言之,我认为Spring Data REST是一种可以在特定情况下为您节省大量时间的工具。不是可以应用于任何问题的银弹。

答案 1 :(得分:1)

我们曾经为项目中的每个实体使用DTO,包括完全传统的分层(数据库,DTO,存储库,服务,控制器......)。跳跃DTO将在某一天拯救我们的生命:)

因此对于一个City实体,其id,name,country,state实现如下:

  1. City表格id,name,county,....
  2. CityDTO具有id,name,county,....属性(与数据库完全相同)
  3. CityRepository findCity(id),....
  4. CityServicefindCity(id) { CityRepository.findCity(id) }
  5. CityControllerfindCity(id) { ConvertToJson( CityService.findCity(id)) }
  6. 太多的样板代码只是为了向客户公开城市信息。由于这是一个简单的实体,所以沿着这些层完成任何业务,只是对象正在经过。 City实体的更改从数据库开始并更改了所有图层。 (例如,添加location属性,因为最后location属性应该作为json向用户公开。添加findByNameAndCountryAllIgnoringCase方法需要更改所有图层(每个图层都需要有新方法)。

    考虑Spring Data Rest(of course with Spring Data),这简直太简单了!

    public interface CityRepository extends CRUDRepository<City, Long> {
       City findByNameAndCountryAllIgnoringCase(String name, String country);
    }
    

    city实体以最少的代码向客户公开,您仍然可以控制城市的曝光方式。 ValidationSecurityObject Mapping ......就在那里。所以你可以调整一切。

    例如,如果我想让客户端不知道city实体属性名称更改(图层分离),那么我可以使用提到的自定义对象映射器https://docs.spring.io/spring-data/rest/docs/3.0.2.RELEASE/reference/html/#customizing-sdr.custom-jackson-deserialization

    总结

    我们尽可能地使用Spring Data Rest,在复杂的用例中,我们仍然可以使用传统的分层,让ServiceController做一些事情。