3

我将标头传递给 spring REST api,例如:

@RequestHeader(value="test-header")

对于 API,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;
}

}

4

3 回答 3

1

编写一个带有注解 @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;
}
于 2017-10-27T07:35:14.130 回答
1

STEP1:使用像@valid这样的spring验证器注解来验证你的请求。

第 2 步:编写您的自定义验证器类。它将负责检查标头并查看它是否具有值或具有预期值。

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

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

有关Spring 中的异常处理的更多信息。

在我们当前的项目中,我们确实使用 java 拦截器来验证请求,但除此之外什么都没有。

于 2015-10-15T01:00:11.170 回答
0

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

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

于 2016-02-17T15:59:13.493 回答