我有以下Rest Controller
类,用于处理与我的Client
实体相关的HTTP
请求。
对于上下文-一个client
(例如锻炼客户端)可以有一个Trainer
,但是一个Trainer
可以有许多客户端。
我是否以正确的方式从控制器返回实体?我正在使用Spring ResponseEntity
类来 Package 客户端相关的响应。为了改进此代码,我是否遗漏了其他控制器实现?
控制器:
@RestController
@RequestMapping(value = "/clients")
public class ClientController {
private final ClientService clientService;
public ClientController(ClientService clientService) {
this.clientService = clientService;
}
@GetMapping("/{clientId}")
ResponseEntity<Client> getClientById(@PathVariable long clientId) {
Client Client = clientService.getClientById(clientId);
return new ResponseEntity<>(Client, HttpStatus.OK);
}
@GetMapping("/trainer/{trainerId}")
ResponseEntity<List<Client>> getClientsByTrainerId(@PathVariable long trainerId) {
List<Client> clients = clientService.getClientsByTrainerId(trainerId);
return new ResponseEntity<>(clients, HttpStatus.OK);
}
@PostMapping
public ResponseEntity<Client> createClient(@RequestBody ClientDTO clientDTO) {
Client newClient = clientService.createNewClient(clientDTO);
return new ResponseEntity<>(newClient, HttpStatus.CREATED);
}
@PutMapping("/{clientId}")
ResponseEntity<Client> updateClient(@PathVariable Long clientId, @RequestBody ClientDTO clientDTO) {
Client editedClient = clientService.editClient(clientId, clientDTO);
return new ResponseEntity<>(editedClient, HttpStatus.OK);
}
}
编辑:添加删除方法
@DeleteMapping("/{clientId}")
long deleteClient(@PathVariable long clientId) {
clientService.deleteClient(clientId);
return clientId;
}
1条答案
按热度按时间qlckcl4x1#
在上面的代码中,返回类型不需要是
ResponseEntity<>
,您可以声明控制器方法来返回任何类型的对象,Spring足够聪明,可以根据需要将预期的返回类型 Package 在ResponseEntity中。例如:
如果要返回除200 OK之外的其他HTTP状态代码,可以使用注解。例如:
我唯一一次让控制器方法返回
ResponseEntitiy<>
是在方法中有逻辑根据某些条件返回不同的响应类型(状态代码)时。顺便说一句,直接在API端点中返回实体通常不是一个好主意。大多数情况下,您需要将实体类型转换为DTO类型,以便将事物的公共表示与持久表示分离。DTO可以具有您想要向客户端公开的任何形状。并且可以独立于域或持久形式而变化。起初,这看起来像是不必要的代码复制形式;有时这两个实体从来没有分歧或具有不同的结构、名称等。2但是很多次经验告诉我们域/持久实体的发展与API契约不同。