在我有限的经验中,我一再被告知你不应该将实体传递到前端或通过休息,而是使用DTO。
Spring Data Rest不是这样做的吗?我简要介绍了一些预测,但这些似乎只是限制了返回的数据,并且仍然期望一个实体作为post方法的参数来保存到数据库中。我在这里遗漏了什么,或者我(和我的同事)是不正确的,因为你不应该传递和实体?
答案 0 :(得分:3)
Spring Data REST支持一种非常快速的方法来创建基于数据库结构的REST API。与其他编程技术相比,我们在谈论分钟与天数。
您为此付出的代价是您的REST API与您的数据库结构紧密耦合。有时,这是一个大问题。有时它不是。这主要取决于数据库设计的质量以及您根据API用户需求进行更改的能力。
简而言之,我认为Spring Data REST是一种可以在特定情况下为您节省大量时间的工具。不是可以应用于任何问题的银弹。
答案 1 :(得分:1)
我们曾经为项目中的每个实体使用DTO,包括完全传统的分层(数据库,DTO,存储库,服务,控制器......)。跳跃DTO将在某一天拯救我们的生命:)
因此对于一个City
实体,其id,name,country,state
实现如下:
City
表格id,name,county,....
列CityDTO
具有id,name,county,....
属性(与数据库完全相同)CityRepository
findCity(id),....
CityService
与findCity(id) { CityRepository.findCity(id) }
CityController
与findCity(id) { ConvertToJson( CityService.findCity(id)) }
太多的样板代码只是为了向客户公开城市信息。由于这是一个简单的实体,所以沿着这些层完成任何业务,只是对象正在经过。
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
实体以最少的代码向客户公开,您仍然可以控制城市的曝光方式。 Validation
,Security
,Object Mapping
......就在那里。所以你可以调整一切。
例如,如果我想让客户端不知道city
实体属性名称更改(图层分离),那么我可以使用提到的自定义对象映射器https://docs.spring.io/spring-data/rest/docs/3.0.2.RELEASE/reference/html/#customizing-sdr.custom-jackson-deserialization
总结
我们尽可能地使用Spring Data Rest,在复杂的用例中,我们仍然可以使用传统的分层,让Service
和Controller
做一些事情。