Spring 5.x缺少请求标头“ Accept”

时间:2019-09-05 18:54:33

标签: java spring rest spring-mvc

我使用的是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)

1 个答案:

答案 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!
    ...
}