RestController 的最佳实践是什么?

What is the best practice for RestController?

代码约定表明控制器中没有逻辑。都应该在服务层处理。我的问题特别是关于 returning ResponseEntity。

应该在RestController处理还是在Service层处理?

两种方法我都试过了。我认为 RestController 是 return ResponseEntity 的合适位置。因为我们在 RestController 中使用映射。

另一方面,我们知道控制器不应该包含任何逻辑。

@GetMapping("/{id}")
public ResponseEntity<Employee> getEmployee(@PathVariable Long id) {
    return ResponseEntity.ok(employeeService.findEmployeeById(id);
}

@GetMapping("/{id}")
public ResponseEntity<Employee> getEmployee(@PathVariable Long id) {
    return employeeService.findEmployeeById(id);
}

用于异常处理的 ControllerAdvice 是我的另一个关注点。哪种方式最好用?

感谢您的预付款。

Code convention says no logic in the controllers.

不是真的。代码约定说每一层都必须执行它自己负责的逻辑。
计算结果,通过请求检索数据 requested/needed 显然不是 rest controller 的工作,而是发送一个 http 响应,返回 ResponseEntity 做的是它的工作。所以这看起来是正确的方式:

@GetMapping("/{id}")
public ResponseEntity<Employee> getEmployee(@PathVariable Long id) {
    return ResponseEntity.ok(employeeService.findEmployeeById(id);
}

如果 ResponseEntity 是由您的服务生成的,则您的服务将与 Http 层耦合。不可取,并使其作为服务的可重用性降低。

Status Code, Response Body, Headers是REST的核心部分之一

控制器应该关心接受请求,要求正确的域服务处理请求,并将响应传递到正确的地方。

控制器不应该在这里执行所有业务逻辑是正确的,但是发送HTTP响应应该在控制器而不是服务中完成。

虽然Status code可以使用@ResponseStatus(HttpStatus.XXX)来发送,这对于我们必须根据条件发送Status Code的场景可能没有帮助。您可以创建自定义 ResponseDTO,它通常具有正文、消息和状态代码。

public ResponseEntity<ResponseDTO> method() {
    return new ResponseEntity<ResponseDTO>(response,response.getStatus()); 
}

首先。业务逻辑应该在服务层中处理,您可以在服务层中使用存储库抽象数据访问。这有助于模块化编程,相互分离的可重用代码片段。这就是模型、视图、控制器(MVC)背后的思想,底层设计。在测试方面,让应用程序的这些部分独立完成各自的工作和测试会更容易。当我们处理对特定方法的安全访问而不是 URL 控制器赋予我们的能力时,在服务方法中抽象您的逻辑也有帮助。因此,您的 RestController 应该调用您的服务层和 return 适当的响应。

其次。对于您的(Rest)ControllerAdvice,让您的异常处理程序有助于 returning 自定义错误。下面是异常处理程序 class.

中的示例
     @ExceptionHandler(CustomerExistException.class)
         public final ResponseEntity<ApiErrorResponse> handleCustomerExistException(
            CustomerExistException ex) {


         ApiErrorResponse errorResponse = new ApiErrorResponse("USR_04", "The email     already exists."
            + "Email", String.valueOf(HttpStatus.BAD_REQUEST));

             return new ResponseEntity<ApiErrorResponse>(errorResponse, HttpStatus.BAD_REQUEST);
}`