Spring支架控制器:从Map方法返回实体的正确方式?

k10s72fa  于 2023-03-11  发布在  Spring
关注(0)|答案(1)|浏览(120)

我有以下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;
}
qlckcl4x

qlckcl4x1#

在上面的代码中,返回类型不需要是ResponseEntity<>,您可以声明控制器方法来返回任何类型的对象,Spring足够聪明,可以根据需要将预期的返回类型 Package 在ResponseEntity中。
例如:

@GetMapping("/{clientId}")
   Client getClientById(@PathVariable long clientId) {
        return clientService.getClientById(clientId);
   }

如果要返回除200 OK之外的其他HTTP状态代码,可以使用注解。例如:

@PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public Client createClient(@RequestBody ClientDTO clientDTO) {
        return clientService.createNewClient(clientDTO);
    }

我唯一一次让控制器方法返回ResponseEntitiy<>是在方法中有逻辑根据某些条件返回不同的响应类型(状态代码)时。
顺便说一句,直接在API端点中返回实体通常不是一个好主意。大多数情况下,您需要将实体类型转换为DTO类型,以便将事物的公共表示与持久表示分离。DTO可以具有您想要向客户端公开的任何形状。并且可以独立于域或持久形式而变化。起初,这看起来像是不必要的代码复制形式;有时这两个实体从来没有分歧或具有不同的结构、名称等。2但是很多次经验告诉我们域/持久实体的发展与API契约不同。

相关问题