我使用的是 Spring 版本 4.x,升级到 5.x - 我注意到,如果请求中未提供 Accept header ,某些 API 请求会失败 (MissingRequestHeaderException)。
该接口(interface)实际上并不需要它们,因为它没有被使用。界面中没有它的 API 工作正常。解决方案是将其从所有 API 中删除,无论它在哪里。但这不是我们现在想要采取的路径,我正在寻找一种通用的解决方案,可以应用于所有 API,而无需单独更改每个 API。
有没有办法让 Spring 忽略接口(interface)中的这个参数?
或者也许处理 MissingRequestHeaderException 以便忽略它并处理 API 请求,这可能吗?
API接口(interface):
public Void setEmployeeDetails( @PathVariable( "employeeId" )Integer employeeId, @Valid @RequestBody EDetails eDetails, String accept )
实现接口(interface)的 API Controller :
Void setEmployeeDetails( @ApiParam(value = "ID of the employee.",required=true ) @PathVariable("employeeId") Integer employeeId,
@ApiParam(value = "" ,required=true ) @Valid @RequestBody EDetails eDetails,
@RequestHeader("Accept") String accept)
最佳答案
MissingRequestHeaderException
的 Javadoc 说:
ServletRequestBindingException
subclass that indicates that a request header expected in the method parameters of an@RequestMapping
method is not present.
检查 Spring 源代码,似乎该异常仅由 RequestHeaderMethodArgumentResolver
抛出,其中显示:
Resolves method arguments annotated with
@RequestHeader
except forMap
arguments. SeeRequestHeaderMapMethodArgumentResolver
for details onMap
arguments annotated with@RequestHeader
.An
@RequestHeader
is a named value resolved from a request header. It has a required flag and a default value to fall back on when the request header does not exist.
因此,如果您收到该错误,那是因为您的代码要求 Accept
header ,但未指定 required=false
,例如
@RequestMapping(...)
public void foo(@RequestHeader(name="Accept", required=false) String accept) {
// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑
// Missing!
...
}
关于java - Spring 5.x 缺少请求 header "Accept",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57811495/