首页 > 解决方案 > 最好返回通用响应实体类型来处理错误或抛出异常

问题描述

发生错误时返回通用响应实体ResponseEntity<*>或抛出异常更好吗?

考虑以下 kotlin 代码:

@PostMapping("/customer")
fun handleRequest(@Valid @RequestBody customer: Customer, result: BindingResult): ResponseEntity<CustomerResponse> {

    if(result.hasErrors()) {
     // #### Use generic response entity for return type 
     // #### Or throw error to be picked up in controller advice ?
    }

    val isValid = recapcthaService.validate(...)

    if(!isValid){
     // #### Use generic response entity for return type
     // #### Or throw error to be picked up in controller advice ?
    }
}

请求处理函数返回ResponseEntity<CustomerResponse>但是在错误状态的情况下,如验证错误或 recapctha 验证失败,我想返回一个不同的返回 a ResponseEntity<ErrorResponse> ,因为这ErrorResponse是错误/异常的常见响应类型。

在这种情况下,最好将返回类型更改为ResponseEntity<*>或抛出异常以被控制器建议拾取?

标签: springspring-bootspring-mvc

解决方案


这更像是一个建议。显然,这两种方法都可以正常工作。我会包装ErrorResponse在一个 customValidationeException中。这样,您可以从任何有错误响应的地方抛出此异常。也将使用自定义@ControllerAdvice来处理ValidationException并将其映射到ResponseEntity. 这对于您想要映射的任何其他自定义异常很有用。例如,您还可以将绑定结果从MethodArgumentNotValidException.

就像是

@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {
   @Override
   protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headera, HttpStatus status, WebREquest request) {return ResponseEntity...};
   @ExceptionHandler(ValidationException.class) }
   protected ResponseEntity<ErrorResponse> handleValidationErrors(ValidationExceptionex) {return ResponseEntity...};
}

有关进一步的解释,您可以在这里查看https://www.baeldung.com/global-error-handler-in-a-spring-rest-api


推荐阅读