首页 > 解决方案 > Spring Boot Rest Controller 端点异常:HttpMediaTypeNotAcceptableException

问题描述

我在未填写必填字段时遇到问题,日志中显示以下异常:

org.springframework.web.HttpMediaTypeNotAcceptableException:找不到可接受的表示

假设我有一个包含如下属性的对象 CodeRequest:

@NotBlank(message = "payloadFormatIndicator.required")
@Size(max = 2, message = "payloadFormatIndicator.size")
private String payloadFormatIndicator;

我的控制器将对象 CodeRequest 作为参数,如下所示:

@PostMapping(value = "/dummy", produces = MediaType.IMAGE_PNG_VALUE)
public ResponseEntity<BufferedImage> generateQRCode(@Valid @RequestBody CodeRequest paymentRequest) throws Exception {

    log.debug("generateQRCode with the following request {}", paymentRequest);

    return ResponseEntity.status(HttpStatus.OK).body(ipsPaymentService.generateQRCode(paymentRequest));
}

当我将必填字段payloadFormatIndicator留空时,我希望payloadFormatIndicator.required在我的回复中收到一条错误消息。

但是,我在日志中收到以下错误消息:

org.springframework.web.HttpMediaTypeNotAcceptableException:找不到可接受的表示

我的异常处理程序如下所示:

@Slf4j
@ControllerAdvice

public class RestControllerExceptionHandler extends ResponseEntityExceptionHandler {
    
    @Override
    public ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException exception, HttpHeaders headers,
                                                               HttpStatus status, WebRequest request) {
        log.error(exception.getMessage(), exception);
        ExceptionResponse exceptionResponse = new ExceptionResponse(HttpStatus.BAD_REQUEST,
            exception.getBindingResult().getAllErrors().get(0).getDefaultMessage());
    
        return new ResponseEntity<>(exceptionResponse, new HttpHeaders(), exceptionResponse.getHttpStatus());
    }

看起来因为方法 generateQRCode 正在返回 ResponseEntity<BufferedImage>它导致了这个问题,因为对于我控制器上的其他方法,异常处理工作正常。

我正在使用 swagger 测试其余的 API,内容类型如下所示: 在此处输入图像描述

知道如何解决吗?

标签: javaspring-bootspring-restcontroller-advice

解决方案


问题是由于生产者媒体类型。响应仅接受image/png,但当出现错误时,媒体类型为application/json

像这样更改您的代码,

@PostMapping(value = "/dummy", produces = "application/json, image/png")

推荐阅读