Spring MVC 针对Sping Boot 中的@RestController的一般响应?

cetgtptt  于 2022-11-15  发布在  Spring
关注(0)|答案(1)|浏览(214)

在我的Sping Boot 应用中,我只是第一次使用Optional,在检查了几个项目和主题之后,现在我尝试构建一种方法,如下所示:

存储库:

Optional<Employee> findByEmail(String email);

服务:

public Response findByEmail(String email) {
    return employeeRepository.findByEmail(email)
            // if record is found, I think no need to return status or message
            .map(e -> Response.builder().data(e).build()) 
            .orElseGet(() -> Response.builder().status(404)
                .data(null).message("Not found!").build());
}

回应:

@Data
@Builder
public class Response {
    private int status;
    private Object data;
    private String message;
}

控制器:

@GetMapping("/employees/{email}")
public ResponseEntity<Response> findByEmail(@PathVariable String email) {
    final Response response = employeeService.findByEmail(email);
    return ResponseEntity
            .status(response.getStatus())

            .body(response.getMessage(), response.getData()); 
            // throws "Expected 1 arguments but found 2" error
}

以下是我需要澄清的几点:

**1.**这是对Sping Boot 应用中的所有Optional类型使用通用响应的正确方法吗?如果不是,我应该如何更改它(我希望从服务返回通用响应)?
**2.**如何修复控制器中的 throws“预期1个参数,但找到2个” 错误?

eiee3dmh

eiee3dmh1#

从我上面的评论来看- * 你在混淆关注点。服务应该只关心业务逻辑(例如,不是HTTP状态代码)。这是控制器的工作。Optional的使用是正确的,但是来自服务层的Response返回类型不是这样的。同样,如果资源没有找到,类似Not Found的错误会由Sping Boot 中的Rest Controller自动处理。如果您希望添加自定义逻辑并准备通用响应,请包含适当的异常处理,例如@ControllerAdvice(它允许您重用控制器的异常)。*
例如,其中一个解决方案是抛出NoSuchElementException。这是说明性的,如果你想以通用的方式处理其他类似的情况(例如空指针、内部服务器错误、以更自定义的方式验证错误),这也适用。

public Employee findByEmail(String email) {
    return employeeRepository.findByEmail(email) //assuming findByEmail is returning an Optional<Employee>, otherwise - simply use a null check.
            .orElseThrow(NoSuchElementException::new)
}

在@控制器建议类内部

@ExceptionHandler(NoSuchElementException.class)
  @ResponseBody
  @Order(Ordered.HIGHEST_PRECEDENCE)
  public final ResponseEntity<APIResponseErrorContainer> handleNotFound(
      NoSuchElementException ex) {
// log exception here if you wish to
    return new ResponseEntity<>(createCustomResponseBody(),  HttpStatus.NOT_FOUND);
  }

相关问题