我正在将标题传递给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;
}
}
答案 0 :(得分:0)
第1步:使用像@valid这样的弹簧验证器注释来验证您的请求。
第2步:编写自定义验证程序类。负责检查标题并查看它是否具有值或是否具有预期值。
第3步:如果请求不正确,验证者会抛出您的自定义异常。
第4步:编写异常处理程序类。在类中定义如果捕获了STEP 3中的异常,我必须返回什么响应。
有关Exception Handling in Spring的更多信息。
在我们当前的项目中,我们使用java拦截器来验证请求,但没有任何内容可以解决。
答案 1 :(得分:0)
另一种方法是使用Spring拦截器(HandlerInterceptorAdapter
),正如您在问题中提到的那样,使用@ControllerAdvice
并使用@ExceptionHandler
方法返回您的JSON。
答案 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;
}