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);
}`
代码约定表明控制器中没有逻辑。都应该在服务层处理。我的问题特别是关于 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);
}`