如何将内容输出到 HttpServletResponse 缓冲区?
How do I output content to a HttpServletResponse buffer?
我正在使用 Spring 4.3.8.RELEASE。我想为特定的禁止错误设置错误消息。我的控制器里有这个。 "response" 属于 "javax.servlet.HttpServletResponse".
类型
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.setContentLength(errorMsg.length());
byte[] buffer = new byte[10240];
final OutputStream output = response.getOutputStream();
output.write(buffer, 0, errorMsg.length());
output.flush();
然而,内容似乎没有被返回,至少我在单元测试中看不到它...
final MvcResult result = mockMvc.perform(get(contextPath + "/myurl")
.contextPath(contextPath)
.principal(auth)
.param("param1", param1)
.param("param2", param2))
.andExpect(status().isForbidden())
.andReturn();
// Verify the error message is correct
final String msgKey = "error.code";
final String errorMsg = MessageFormat.format(resourceBundle.getString(msgKey), new Object[] {});
Assert.assertEquals("Failed to return proper error message.", errorMsg, result.getResponse().getContentAsString());
声明失败,表示响应字符串为空。将响应写回 HttpServletResponse 缓冲区的正确方法是什么?
您可以使用响应实体
@RequestMapping("/handle")
public ResponseEntity<String> handle() {
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setLocation(location);
responseHeaders.set("MyResponseHeader", "MyValue");
return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.FORBIDDEN);
}
您永远不会将 errorMsg
写成 output
或 buffer
。
类似
response.getWriter().write(errorMsg)
应该可以解决问题
一件好事是 throw
一个自定义异常将 HttpServletResponse
作为参数传递或使用一个已经存在的异常(如果它服务于您的用例),这样错误就是在控制器方法之外处理(单独关注,被认为是一种好的做法)。
如果没有,您可以直接在控制器方法中设置响应。
所以在这两种情况下你都可以使用HttpServletResponse
s sendError
方法,像这样:
// your controller (or exception) method
try {
response.sendError(HttpStatus.FORBIDEN.value(), "My custom error message")
} catch (IOException e) {
// handle if error could not be sent
}
}
这将打印出一个字符串作为响应,其中包含所需的 HttpStatus
。
另外,这里有一些关于 Spring 异常处理的 'oldie-but-goldie' 信息 here
我正在使用 Spring 4.3.8.RELEASE。我想为特定的禁止错误设置错误消息。我的控制器里有这个。 "response" 属于 "javax.servlet.HttpServletResponse".
类型 response.setStatus(HttpServletResponse.SC_FORBIDDEN);
response.setContentLength(errorMsg.length());
byte[] buffer = new byte[10240];
final OutputStream output = response.getOutputStream();
output.write(buffer, 0, errorMsg.length());
output.flush();
然而,内容似乎没有被返回,至少我在单元测试中看不到它...
final MvcResult result = mockMvc.perform(get(contextPath + "/myurl")
.contextPath(contextPath)
.principal(auth)
.param("param1", param1)
.param("param2", param2))
.andExpect(status().isForbidden())
.andReturn();
// Verify the error message is correct
final String msgKey = "error.code";
final String errorMsg = MessageFormat.format(resourceBundle.getString(msgKey), new Object[] {});
Assert.assertEquals("Failed to return proper error message.", errorMsg, result.getResponse().getContentAsString());
声明失败,表示响应字符串为空。将响应写回 HttpServletResponse 缓冲区的正确方法是什么?
您可以使用响应实体
@RequestMapping("/handle")
public ResponseEntity<String> handle() {
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setLocation(location);
responseHeaders.set("MyResponseHeader", "MyValue");
return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.FORBIDDEN);
}
您永远不会将 errorMsg
写成 output
或 buffer
。
类似
response.getWriter().write(errorMsg)
应该可以解决问题
一件好事是 throw
一个自定义异常将 HttpServletResponse
作为参数传递或使用一个已经存在的异常(如果它服务于您的用例),这样错误就是在控制器方法之外处理(单独关注,被认为是一种好的做法)。
如果没有,您可以直接在控制器方法中设置响应。
所以在这两种情况下你都可以使用HttpServletResponse
s sendError
方法,像这样:
// your controller (or exception) method
try {
response.sendError(HttpStatus.FORBIDEN.value(), "My custom error message")
} catch (IOException e) {
// handle if error could not be sent
}
}
这将打印出一个字符串作为响应,其中包含所需的 HttpStatus
。
另外,这里有一些关于 Spring 异常处理的 'oldie-but-goldie' 信息 here