Java 应该如何';缺失';请求头是否由Spring引导控制器处理?

Java 应该如何';缺失';请求头是否由Spring引导控制器处理?,java,spring-boot,spring-mvc,error-handling,controller,Java,Spring Boot,Spring Mvc,Error Handling,Controller,我正在编写一个Spring启动应用程序。我的控制器有2个自定义请求头。我执行了几个测试,结果发现我的应用程序在头不存在时返回“404” 然而,我期望这会导致“400”错误 有人能详细说明为什么会发生这种情况吗?我该如何妥善处理?就像在告诉服务的消费者报头丢失一样 @RestController("fundsConfirmationController") @RequestMapping( value="/accounts/{accountId}/funds-confirmations",

我正在编写一个Spring启动应用程序。我的控制器有2个自定义请求头。我执行了几个测试,结果发现我的应用程序在头不存在时返回“404”

然而,我期望这会导致“400”错误

有人能详细说明为什么会发生这种情况吗?我该如何妥善处理?就像在告诉服务的消费者报头丢失一样

@RestController("fundsConfirmationController")
@RequestMapping(
    value="/accounts/{accountId}/funds-confirmations",
    headers = {"X-CAF-MSGID", "X-AccessToken"}
) 
public class FundsConfirmationController implements FundsConfirmationControllerI{

private FundsConfirmationServiceI fundsConfirmationService;

@Autowired
public FundsConfirmationController(FundsConfirmationServiceI fundsConfirmationService){
    this.fundsConfirmationService = fundsConfirmationService;
}

@GetMapping(
        consumes = MediaType.APPLICATION_JSON_VALUE,
        produces = MediaType.APPLICATION_JSON_VALUE
)
public ResponseEntity<?> fundsConfirmation(@RequestHeader(value="X-CAF-MSGID") String messageId,
                                           @RequestHeader(value="X-AccessToken") String accessToken,
                                           FundsConfirmationRequest requestParams) { ... }
@RestController(“资金确认控制器”)
@请求映射(
value=“/accounts/{accountId}/funds confirmations”,
头文件={“X-CAF-MSGID”,“X-AccessToken”}
) 
公共类FundsConfigurationController实现FundsConfigurationControlleri{
私人基金确认服务I基金确认服务;
@自动连线
公共资金确认控制员(资金确认服务I资金确认服务){
this.fundsConfirmationService=fundsConfirmationService;
}
@GetMapping(
consumes=MediaType.APPLICATION\u JSON\u值,
products=MediaType.APPLICATION\u JSON\u值
)
公共响应资金确认(@RequestHeader(value=“X-CAF-MSGID”)字符串消息ID,
@RequestHeader(value=“X-AccessToken”)字符串AccessToken,
资金确认请求请求参数{…}

2个解决方案也可以这样做

首先将
@RequestHeader
required
false

@RequestMapping(value = "/{blabla}", method = RequestMethod.POST)
public void post(@RequestHeader(value="X-CAF-MSGID", required=false) String X-CAF-MSGID) {
    if(X-CAF-MSGID == null) {
        // Your JSON Error Handling
    } else {
        // Your Processing
    }
}
第二次使用
HttpServletRequest
而不是
@RequestHeader

@RequestMapping(value = "/{blabla}", method = RequestMethod.POST)
public void post(HttpServletRequest request) {
    String X-CAF-MSGID = request.getHeader("X-CAF-MSGID");
    if(X-CAF-MSGID == null) {
        // Your JSON Error Handling
    } else {
        // Your Processing
    }
}

有两种解决方案可以做到这一点

首先将
@RequestHeader
required
false

@RequestMapping(value = "/{blabla}", method = RequestMethod.POST)
public void post(@RequestHeader(value="X-CAF-MSGID", required=false) String X-CAF-MSGID) {
    if(X-CAF-MSGID == null) {
        // Your JSON Error Handling
    } else {
        // Your Processing
    }
}
第二次使用
HttpServletRequest
而不是
@RequestHeader

@RequestMapping(value = "/{blabla}", method = RequestMethod.POST)
public void post(HttpServletRequest request) {
    String X-CAF-MSGID = request.getHeader("X-CAF-MSGID");
    if(X-CAF-MSGID == null) {
        // Your JSON Error Handling
    } else {
        // Your Processing
    }
}

默认情况下,HTTP标头用于定义端点。它们是进一步的规范,因此404是对没有所述标头的请求的适当响应。感谢您的响应。默认情况下,HTTP标头用于定义端点。它们是进一步的规范,因此404是对HTTP标头的适当响应r没有上述标题的请求。感谢您的回复。