处理异常时返回错误的错误响应

时间:2020-09-08 23:27:49

标签: spring-boot

Spring Boot

@RestController
public class ProductsController {
  @PostMapping("/product")
    public ResponseEntity<Product> createProduct(@RequestBody String payload) {
        Product product = new Gson().fromJson(payload, Product.class);
        checkProduct(product);
        product.setCreated(new Date());
        if (product.getPrice() == null) {
            throw new InvalidParameterException("Invalid price");
        }
        logger.info("createProduct: product:\n" + product);
        return new ResponseEntity<Product>(product, HttpStatus.OK);
    }

这是我的自定义异常处理程序InvalidParameterException:

@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(InvalidParameterException.class)
    protected ResponseEntity<Object> handleInvalidParameterException(InvalidParameterException ex,
                                                                     WebRequest request) {
        ErrorResponse error = new ErrorResponse(ex.getMessage());
        return new ResponseEntity(error, HttpStatus.BAD_REQUEST);
    }

    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
                                                                  HttpHeaders headers, HttpStatus status,
                                                                  WebRequest request) {
        List<String> details = new ArrayList<>();
        for(ObjectError error : ex.getBindingResult().getAllErrors()) {
            details.add(error.getDefaultMessage());
        }
        ErrorResponse error = new ErrorResponse("Validation Failed", details);
        return new ResponseEntity(error, HttpStatus.BAD_REQUEST);
    }
}

但是当开始请求时没有价格:

# Create  product without price
POST :BASE_URL:URL_SUFFIX/product
:HEADERS

{
  "name": "product name_1"
}

响应为:

   {
      "timestamp": "2020-09-08T23:25:25.514+00:00",
      "status": 500,
      "error": "Internal Server Error",
      "message": "",
      "path": "/api/v1/product"
}

但是结果必须是:

 {
          "timestamp": "2020-09-08T23:25:25.514+00:00",
          "status": 400,
          "error": "Bad request",
          "message": "Invalid price",
          "path": "/api/v1/product"
    }

为什么不正确的错误响应?

我遇到错误:

org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class myproject.model.ErrorResponse
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:230) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:219) ~[spring-webmvc-

0 个答案:

没有答案
相关问题