Java 如何将ResponseEntity写入HttpServletResponse?
如何将ResponseEntity写入HttpServletResponse(因为它会生成@responseBy) 例如,我有身份验证成功处理程序:Java 如何将ResponseEntity写入HttpServletResponse?,java,spring,Java,Spring,如何将ResponseEntity写入HttpServletResponse(因为它会生成@responseBy) 例如,我有身份验证成功处理程序: @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
Map responseMap = new HashMap();
responseMap.put("user", "my_user_name");
ResponseEntity responseEntity = new ResponseEntity(response, HttpStatus.OK);
}
如果使用MappingJackson2HttpMessageConverter,我会出现错误:“无法写入内容:未处于非阻塞模式。”
代码:
HttpServletResponse实现处理程序的最佳实践是什么?您可以使用自定义响应对象,使用Jackson ObjectMapper将其转换为JSON字符串,并将结果写入请求: MyResponseObject.java
private String user;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
MyResponseObject responseObj = new MyResponseObject();
responseObj.setUser("my_user_name");
httpServletResponse.setStatus(HttpStatus.OK.value());
String json = new ObjectMapper().writeValueAsString(responseObj);
httpServletResponse.getWriter().write(json);
httpServletResponse.flushBuffer();
}
MyAuthenticationSuccessHandler.java
private String user;
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
MyResponseObject responseObj = new MyResponseObject();
responseObj.setUser("my_user_name");
httpServletResponse.setStatus(HttpStatus.OK.value());
String json = new ObjectMapper().writeValueAsString(responseObj);
httpServletResponse.getWriter().write(json);
httpServletResponse.flushBuffer();
}
基于,我创建了这个通用函数,用于将ResponseEntity
复制到HttpServletResponse
:
public static void populateResponse(ResponseEntity<String> responseEntity, HttpServletResponse servletResponse)
throws IOException {
for (Map.Entry<String, List<String>> header : responseEntity.getHeaders().entrySet()) {
String chave = header.getKey();
for (String valor : header.getValue()) {
servletResponse.addHeader(chave, valor);
}
}
servletResponse.setStatus(responseEntity.getStatusCodeValue());
servletResponse.getWriter().write(responseEntity.getBody());
}
公共静态void populateResponse(ResponseEntity ResponseEntity,HttpServletResponse servletResponse)
抛出IOException{
对于(Map.Entry头:responseEntity.getHeaders().entrySet()){
字符串chave=header.getKey();
for(字符串值:header.getValue()){
addHeader(chave,valor);
}
}
servletResponse.setStatus(responseEntity.getStatusCodeValue());
servletResponse.getWriter().write(responseEntity.getBody());
}
您不必在响应上写入ResponseEntity,而是在其封装的对象上写入ResponseEntity。具体操作方法:注意:responseEntity.getBody()
可以是null
!首先检查,然后写它是否不是null
。这个函数的问题是它只对响应体使用String
,而在@andrearro88的回答中,我们可以看到使用对象映射器来写json,这意味着如果ResponseEntity的通用值不是StringYes,那么这个函数就不起作用,我添加这个响应主要是因为它复制了一些人(包括我)可能确实需要的标题。根据您的需要,将两者结合或调整即可。