java - 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,内容类型如下所示:
知道如何解决吗?
解决方案
问题是由于生产者媒体类型。响应仅接受image/png
,但当出现错误时,媒体类型为application/json
。
像这样更改您的代码,
@PostMapping(value = "/dummy", produces = "application/json, image/png")
推荐阅读
- python - BeautifulSoup find_all 返回空字符串列表
- java - 为什么调用重写方法的超类引用看起来是多态的,但如果它采用重写的成员变量则不是?
- wpf - 如何在调试日志中找到触发 System.Windows.Data 错误 4 的绑定
- asp.net-core - JsonConvert.SerializeObject 在 .net core 3.1 中不起作用
- javascript - 小型纸牌游戏需要定时器或延迟功能
- python - 如何使用 Python 将 DF 列中的单词替换为另一个单词 - 不包括子字符串
- java - 通过就地修改数组来复制数组中的零
- javascript - 如何检测 React Web 应用程序中的空闲时间?
- azure - 使用 Kusto 查询语言的具有单个数字的图表
- join - 修复连接具有相同变量的两个数据集