我有一个使用 OpenApi 3.0.3 的 Java 应用程序。
我已经实现了一个用于生成 Excel 的端点,在 yaml 中定义如下:
/api/secured/customers/export:
post:
summary: Export customers
description: Identifies the customers by id and exports them
operationId: exportCustomers
tags:
- customers
requestBody:
description: Customers ids
required: true
content:
application/json:
schema:
type: array
items:
type: integer
format: int64
responses:
200:
description: The export file
content:
application/vnd.ms-excel:
schema:
type: string
format: byte
application/octet-stream:
schema:
type: string
format: binary
生成的实现是:
/**
* POST /api/secured/customers/export : Export customers
* Identifies the customers by id and exports them
*
* @param requestBody Customers ids (required)
* @return The export file (status code 200)
*/
@Operation(
operationId = "exportCustomers",
summary = "Export customers",
description = "Identifies the customers by id and exports them",
tags = { "customers" },
responses = {
@ApiResponse(responseCode = "200", description = "The export file", content = {
@Content(mediaType = "application/vnd.ms-excel", schema = @Schema(implementation = byte[].class)),
@Content(mediaType = "application/octet-stream", schema = @Schema(implementation = byte[].class))
})
}
)
@RequestMapping(
method = RequestMethod.POST,
value = "/api/secured/customers/export",
produces = { "application/vnd.ms-excel", "application/octet-stream" },
consumes = { "application/json" }
)
default ResponseEntity<byte[]> exportCustomers(
@Parameter(name = "request_body", description = "Customers ids", required = true) @Valid @RequestBody List<Long> requestBody
) {
return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
}
当 JWT 令牌过期时,就会出现我的问题。当尝试抛出 ExpiredJwtTokenException 时,我收到以下异常:
11:40:34.100 [http-nio-8080-exec-1] WARN o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver: Failure in @ExceptionHandler de.noventi.administration.learning.config.exception.ExceptionHandlerConfig#handleExpiredTokenException(ExpiredTokenException)
org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:256)
at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:245)
at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136)
at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:413)
at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:74)
at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:141)
at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:80)
at de.noventi.administration.learning.config.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:56)
我想这是因为它也没有生成 application/json 。但我尝试添加:
401:
description: Unauthorized
content:
application/json:
schema:
type: string
但这不起作用。
你有什么想法吗?谢谢!
问题似乎可能与您的异常处理程序未生成客户端可以接受的内容类型的响应有关。 HttpMediaTypeNotAcceptableException 表示客户端没有可接受的表示。