简体   繁体   English

如何将 ResponseEntity 写入 HttpServletResponse?

[英]How to write ResponseEntity to HttpServletResponse?

How to write ResponseEntity to HttpServletResponse (as it makes @ResponseBody)?如何将 ResponseEntity 写入 HttpServletResponse(因为它使 @ResponseBody)?

For example I have authentication success handler:例如,我有身份验证成功处理程序:

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

If use MappingJackson2HttpMessageConverter I have error: "Could not write content: not in non blocking mode."如果使用 MappingJackson2HttpMessageConverter 我有错误:“无法写入内容:不在非阻塞模式下。”

Code:代码:

HttpOutputMessage outputMessage = new ServletServerHttpResponse(response);
messageConverter.write(responseEntity, null, outputMessage);

What are the best practices of implementation handlers with HttpServletResponse?使用 HttpServletResponse 实现处理程序的最佳实践是什么?

You can use a custom response object, convert it to a JSON string using the Jackson's ObjectMapper and write the result into the request.您可以使用自定义响应对象,使用 Jackson 的ObjectMapper将其转换为 JSON 字符串并将结果写入请求。


Example例子

MyResponseObject.java MyResponseObject.java

private String user;

public String getUser() {
    return user;
}

public void setUser(String user) {
    this.user = user;
}

MyAuthenticationSuccessHandler.java MyAuthenticationSuccessHandler.java

@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
    MyResponseObject responseObj = new MyResponseObject();
    responseObj.setUser("my_user_name");

    String json = new ObjectMapper().writeValueAsString(responseObj);

    httpServletResponse.setStatus(HttpStatus.OK.value());
    httpServletResponse.getWriter().write(json);
    httpServletResponse.flushBuffer();
}  

Based on andrearro88's answer , I have made this generic function to copy a ResponseEntity to a HttpServletResponse :基于andrearro88 的回答,我制作了这个通用函数来将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());
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM