我使用的是Spring 4.x,并升级到5.x-我注意到,如果请求中未提供Accept标头,则某些API请求将失败(MissingRequestHeaderException)。
该接口实际上并不需要它们,因为它没有被使用。接口中没有它的API可以正常工作。一种解决方案是将其从所有API中的任何位置删除。但这不是我们现在要走的路,我正在寻找一种可以应用于所有API的通用解决方案,而不必分别更改每个API。
有没有办法让Spring在界面中忽略此参数?
或者处理MissingRequestHeaderException以便忽略它并处理API请求,这可能吗?
API接口:
public Void setEmployeeDetails( @PathVariable( "employeeId" )Integer employeeId, @Valid @RequestBody EDetails eDetails, String accept )
实现该接口的API控制器:
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)
答案 0 :(得分:2)
MissingRequestHeaderException
的Javadoc说:
ServletRequestBindingException
子类,它指示不存在@RequestMapping
方法的参数中期望的请求标头。
检查Spring源代码,似乎该异常仅由RequestHeaderMethodArgumentResolver
引发,它表示:
解析使用
@RequestHeader
注释的方法参数,除了Map
参数。有关用RequestHeaderMapMethodArgumentResolver
注释的Map
自变量的详细信息,请参见@RequestHeader
。
@RequestHeader
是从请求标头解析的命名值。 它具有必填标志和一个默认值,当请求标头不存在时,该默认值将重新显示。
因此,如果您遇到该错误,似乎是因为您的代码正在请求Accept
标头,而未指定required=false
,例如
@RequestMapping(...)
public void foo(@RequestHeader(name="Accept", required=false) String accept) {
// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑
// Missing!
...
}