Spring控制器,通过HttpServletResponse自定义响应

时间:2017-05-03 14:52:56

标签: spring spring-mvc

我正在尝试使用HttpServletResponse.getOutputStream()HttpServletResponse.setStatus(int)撰写自定义回复。

但任何与200不同的状态并不考虑我写的反应主体。

我有2个Web应用程序在不同的端口上运行,应用程序“A”必须从应用程序“B”请求数据。为此,我创建了一个控制器,将应用程序“A”上的所有请求隧道传送到应用程序“B”。

示例:

@RequestMapping("/tunnel/**")
public void exchange(HttpServletRequest request, HttpServletResponse response) throws IOException {
   // my service tunnel the request to another server
   // and the response of the server must be replied

   ResponseDescriptor tunnelResponse = tunnelService.request(request);

   response.setStatus(tunnelResponse.getStatus()); 
   // if the status was different them 200, the next line will not work 
   response.getOutputStream().write(tunnelResponse.getResponseBodyAsByteArray());
}

注意,我需要从应用程序A响应来自应用程序B的确切响应。

2 个答案:

答案 0 :(得分:0)

您需要捕获HttpStatusCodeException以获取200以外的响应。

try {
    ResponseDescriptor tunnelResponse = tunnelService.request(request);
    response.setStatus(tunnelResponse.getStatus());
    response.getOutputStream().write(tunnelResponse.getResponseBodyAsByteArray());
} catch (HttpStatusCodeException e) {
    response.setStatus(e.getStatusCode().value());
    response.getOutputStream().write(e.getResponseBodyAsByteArray());
}

答案 1 :(得分:0)

解决!

我创建了@ExceptionHandler和自定义异常TunnelException extends RuntimeException

所以,在我的exchange(...)方法上,我抓住RestClientResponseException并抛出我自己的异常封装(例外)HeadersHttpStatus和{{1} }。

这是异常处理程序:

ResponseBody byte array