Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将ResponseEntity写入HttpServletResponse?_Java_Spring - Fatal编程技术网

Java 如何将ResponseEntity写入HttpServletResponse?

Java 如何将ResponseEntity写入HttpServletResponse?,java,spring,Java,Spring,如何将ResponseEntity写入HttpServletResponse(因为它会生成@responseBy) 例如,我有身份验证成功处理程序: @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {

如何将ResponseEntity写入HttpServletResponse(因为它会生成@responseBy)

例如,我有身份验证成功处理程序:

@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,那么这个函数就不起作用,我添加这个响应主要是因为它复制了一些人(包括我)可能确实需要的标题。根据您的需要,将两者结合或调整即可。