2015-10-15 111 views
0

我传递一个头弹簧REST API,如:如何返回响应体时,头部丢失春季REST API

@RequestHeader(value="test-header") 

头是强制性这里的API,所以我不希望保持可选。 当没有头文件传递时,任何对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

STEP1:像@Valid使用Spring的验证注释,以验证您的要求。

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

步骤3:如果请求不正确,validator会抛出您的自定义异常。

第4步:编写您的异常处理程序类。在类中定义如果发现STEP 3中的异常,我必须返回哪些响应。

欲了解更多关于Exception Handling in Spring的信息。

在我们目前的projet中,我们使用java拦截器来验证请求,但没有任何事情可以证明。

+0

但是我在哪里定义这种情况下的异常处理程序?我在进入REST API时使用异常处理程序。但是,在这种情况下,由于缺少标头(这是强制性的),它甚至不会输入REST API。那么,在这里为这种情况定义异常处理程序? – user1892775

+0

如果您有异常处理程序,那么让您的处理程序捕获400异常,并在处理程序中定义您希望发送的响应。 –

+0

使用这种方法,我能够返回响应主体吗? - 基本上我可能想返回更详细的具体信息的一些JSON。另外,我正在寻找使用验证器的例子吗?如果你有一个有类似作参考的例子,请告诉我。感谢您的帮助 – user1892775

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; 
}