Java 缺少请求标头“;接受;使用Spring5.x

Java 缺少请求标头“;接受;使用Spring5.x,java,spring,rest,spring-mvc,Java,Spring,Rest,Spring Mvc,我使用的是Spring版本4.x,随着升级到5.x,我注意到如果请求中没有提供Accept头,一些API请求将失败(MissingRequestHeaderException) 界面并不真正需要它们,因为它没有被使用。接口中没有它的API工作正常。一个解决方案是将它从所有API中移除,无论它在哪里。但这不是我们现在想要走的路,我正在寻找一种通用的解决方案,它可以应用于所有API,而无需单独更改每个API 有没有办法让Spring忽略界面中的这个参数 或者处理MissingRequestHeade

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

MissingRequestHeaderException的Javadoc说:

ServletRequestBindingException
子类,该子类指示
@RequestMapping
方法的方法参数中预期的请求头不存在

检查Spring源代码时,似乎该异常仅由
RequestHeaderMethodArgumentResolver
引发,它表示:

解析用
@RequestHeader
注释的方法参数,但
映射
参数除外。有关用
@RequestHeader
注释的
映射
参数的详细信息,请参见
RequestHeaderMapMethodArgumentResolver

@RequestHeader
是从请求头解析的命名值它有一个必需的标志和一个默认值,当请求头不存在时可以使用

因此,如果您收到该错误,似乎是因为您的代码请求
Accept
标题,并且没有指定
required=false
,例如

@RequestMapping(...)
public void foo(@RequestHeader(name="Accept", required=false) String accept) {
    //                                        ↑↑↑↑↑↑↑↑↑↑↑↑↑↑
    //                                           Missing!
    ...
}

MissingRequestHeaderException的Javadoc说:

ServletRequestBindingException
子类,该子类指示
@RequestMapping
方法的方法参数中预期的请求头不存在

检查Spring源代码时,似乎该异常仅由
RequestHeaderMethodArgumentResolver
引发,它表示:

解析用
@RequestHeader
注释的方法参数,但
映射
参数除外。有关用
@RequestHeader
注释的
映射
参数的详细信息,请参见
RequestHeaderMapMethodArgumentResolver

@RequestHeader
是从请求头解析的命名值它有一个必需的标志和一个默认值,当请求头不存在时可以使用

因此,如果您收到该错误,似乎是因为您的代码请求
Accept
标题,并且没有指定
required=false
,例如

@RequestMapping(...)
public void foo(@RequestHeader(name="Accept", required=false) String accept) {
    //                                        ↑↑↑↑↑↑↑↑↑↑↑↑↑↑
    //                                           Missing!
    ...
}

包括控制器定义。包括控制器定义。好。正如问题的最后一行(代码)所表明的,我正在寻找一种解决方案,它不涉及单独更改所有API。此外,我的招摇过市代码gen总是用这个参数生成它,我不认为有办法告诉它不要自动取款机。@Chillax似乎你的代码不好,所以你应该修复它。如果不需要,为什么API会被编码为需要
Accept
头?或者它是必需的,您需要修复不发送它的代码,或者它不是必需的,您需要修复API以不需要它。很好。正如问题的最后一行(代码)所表明的,我正在寻找一种解决方案,它不涉及单独更改所有API。此外,我的招摇过市代码gen总是用这个参数生成它,我不认为有办法告诉它不要自动取款机。@Chillax似乎你的代码不好,所以你应该修复它。如果不需要,为什么API会被编码为需要
Accept
头?要么它是必需的,您需要修复不发送它的代码;要么它不是必需的,您需要修复API以不需要它。