我正在尝试使用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的确切响应。
答案 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
并抛出我自己的异常封装(例外)Headers
,HttpStatus
和{{1} }。
这是异常处理程序:
ResponseBody byte array