我正在使用spring框架开发一个宁静的Web服务。我对如何在项目中正确使用DTO有一些疑问。
首先,我看到了许多有关使用DTO的代码示例,并且始终存在与实体的一对一映射。对于User
实体,我们有UserDto
,对于Country
,我们有CountryDto
等。我认为这一点都不灵活。对于每项服务,我都需要两个DTO进行输入和输出。可以吗?
如果为每个服务定义两个DTO,是否可以用请求和响应后缀来命名它们?例如,对于createUser
服务,我有两个名为CreateUserRequest
和CreateUserResponse
的DTO对象。
某些服务没有输出(仅是状态码)或输入(仅是URL中的ID)。我应该为他们定义一个空的DTO吗?如果我在这些情况下没有定义DTO,那会有些混乱,因为有时您为服务定义了两个DTO,有时只是一个。
我也应该将路径变量如/users/{id}
映射到DTO对象吗?例如,代替:
@GetMapping("/users/{id}")
public ResponseEntity getUser(@PathVariable(value = "id") Long id)
做类似的事情:
@GetMapping("/users/{id}")
public ResponseEntity getUser(@PathVariable(value = "id") GetUserRequest request)
答案 0 :(得分:0)
遵循此模式:
@RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<User> getUser(@PathVariable long id) {
ResponseEntity<User> response = null;
try {
User user = userService.getUser(id);
response = new ResponseEntity<User>(user, HttpStatus.OK);
} catch (ApplicationException ex) {
response = new ResponseEntity<User>(HttpStatus.NOT_FOUND);
}
return response;
}
请勿创建这样的网址:/users/{id}
创建一个像这样的网址-/{id}
-这将提供更多抽象。
答案 1 :(得分:0)
在理想的静态Web服务中,您使用属性而不是请求-响应结构来操作资源。因此,如果您创建User,则可以接受并返回相同的DTO,并且方法如下所示:
@PostMapping("/")
public ResponseEntity<User> addUser(@RequestBody User user)
使用GET请求主体在技术上是可行的,但实际上已弃用,请使用路径变量和请求参数。
某些服务没有输出(仅是状态码)或输入(仅是URL中的ID)。我应该为他们定义一个空的DTO吗?
否,您不应为没有的对象定义DTO。
最后一个细节:如果您有多种方法来操纵相同的资源(例如,用户),请不要为获取,发布等创建多个用户DTO。