Spring MVC 如何在spring REST api中缺少标头时返回响应正文

vsmadaxz  于 2022-11-24  发布在  Spring
关注(0)|答案(4)|浏览(164)

我将一个头传递给spring REST api,如下所示:

@RequestHeader(value="test-header")

如果没有头被传递,任何对API的调用都会返回一个标准的400错误,表明请求在语法上是错误的,然后它就不会进入REST API。但是,我想构造一个正确的响应体并返回一个json来处理这个错误。我不确定最好的方法是什么。我想使用Spring拦截器并检查这个头是否被传递,但是我不确定我是否可以从这里创建一个响应体。至少我不知道如何做。
拦截器的方法能解决这个问题吗?2如果能,怎么解决?3如果不能,有什么选择?4有人能帮忙吗?
更新:
这就是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;
}

}

qvtsj1bj

qvtsj1bj1#

**步骤1:**使用@valid之类的Spring验证器注解来验证您的请求。
**步骤2:**编写自定义验证器类,它将负责检查头文件,看看它是否有值或有预期值。
**步骤3:**如果请求不正确,验证程序将抛出自定义异常。
**第4步:**编写异常处理程序类。在类中定义如果第3步中的异常被捕获,必须返回什么响应。

有关Exception Handling in Spring的详细信息。
在我们当前的项目中,我们确实使用了一个java拦截器来验证请求,但除此之外没有其他内容。

djmepvbi

djmepvbi2#

编写一个带有注解@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;
}
dnph8jn4

dnph8jn43#

另一种方法是使用Spring拦截器(HandlerInterceptorAdapter),正如您在问题中提到的,使用@ControllerAdvice并在@ExceptionHandler方法中返回JSON。
看看下面的帖子:http://www.journaldev.com/2651/spring-mvc-exception-handling-exceptionhandler-controlleradvice-handlerexceptionresolver-json-response-example

lo8azlld

lo8azlld4#

这是晚了,但然后,一个非常简单的方法来处理这种类型的问题是使用一个控制器建议类,它允许您在一个全局处理组件中处理整个应用程序的异常。
spring抛出的异常是MissingRequestHeaderException,您可以在控制器建议类中提供一个自定义处理程序。
第一个

相关问题