如何在Spring REST api中缺少标头时返回响应主体

时间:2015-10-15 00:04:07

标签: java spring spring-mvc interceptor spring-restcontroller

我正在将标题传递给Spring REST api,如:

@RequestHeader(value="test-header")
这里必须使用

标头,因此我不想让它保持可选。 当没有传递头时,对API的任何调用都会返回一个标准的400错误,指示请求是语法错误,然后它不会进入REST API。但是,我想构造一个合适的ResponseBody并为此错误返回一个json。我不确定最好的方法。我想过使用spring拦截器并检查这个头是否通过,但是我不确定我是否可以从这里创建一个响应体。至少我无法弄清楚如何这样做。

拦截器会为此工作吗?如果有,怎么样?如果没有,那么有哪些选择?有人可以帮忙吗?

更新

以下是REST API的用法:

public void methodA(@RequestHeader(value="test-header") String header, @RequestBody User user, HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
...
...

} 

当标题存在时,它将进入REST API并继续逻辑。但是,如果标头不存在,它不会进入API并只返回标准400错误。

我写的拦截器就像:

public class XXXInterceptor extends HandlerInterceptorAdapter { 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
...
...
...

return true;
}

}

3 个答案:

答案 0 :(得分:0)

第1步:使用像@valid这样的弹簧验证器注释来验证您的请求。

第2步:编写自定义验证程序类。负责检查标题并查看它是否具有值或是否具有预期值。

第3步:如果请求不正确,验证者会抛出您的自定义异常。

第4步:编写异常处理程序类。在类中定义如果捕获了STEP 3中的异常,我必须返回什么响应。

有关Exception Handling in Spring的更多信息。

在我们当前的项目中,我们使用java拦截器来验证请求,但没有任何内容可以解决。

答案 1 :(得分:0)

另一种方法是使用Spring拦截器(HandlerInterceptorAdapter),正如您在问题中提到的那样,使用@ControllerAdvice并使用@ExceptionHandler方法返回您的JSON。

请看以下帖子:http://www.journaldev.com/2651/spring-mvc-exception-handling-exceptionhandler-controlleradvice-handlerexceptionresolver-json-response-example

答案 2 :(得分:0)

使用注释@ExceptionHandler编写一个方法并使用ServletRequestBindingException.class,因为如果未命中则抛出此异常。您可以从此方法返回任何类型的对象。

例如

@ExceptionHandler(ServletRequestBindingException.class)
public ResponseEntity<ResponseObject> handleHeaderError(){

    ResponseObject responseObject=new ResponseObject();
    responseObject.setStatus(Constants.ResponseStatus.FAILURE.getStatus());
    responseObject.setMessage(header_missing_message);

    ResponseEntity<ResponseObject> responseEntity=new ResponseEntity<ResponseObject>(responseObject, HttpStatus.BAD_REQUEST);
    return responseEntity;
}
相关问题