gpt4 book ai didi

java - HttpMessageNotReadableException : Could not read document: Stream closed;

转载 作者:行者123 更新时间:2023-12-02 12:20:16 24 4
gpt4 key购买 nike

我正在使用 Spring boot 并使用过滤器过滤请求。该过滤器用于检查用户验证,该验证正在从请求正文中读取一些数据(为此我使用了 HttpServletRequestWrapper 实现)。从 requestWrapper 我得到了预期的数据,并且我的服务在过滤器中也运行良好。但是,当成功时,过滤器将请求传递给主 Controller ,我收到一个流关闭异常,如下所示:

   o.s.w.s.m.s.DefaultHandlerExceptionResolver - Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Stream closed; nested exception is java.io.IOException: Stream closed

这是过滤器类:

@WebFilter(urlPatterns = {"/getDocs" })
public class AuthenticationFilter implements Filter{

private static Logger logger = Logger.getLogger(AuthenticationFilter.class);

@Autowired
private UserVerificationService userVerificationService;

@Override
public void destroy() {
// TODO Auto-generated method stub

}

@Override
public void doFilter(ServletRequest arg0, ServletResponse response, FilterChain chain)
throws IOException, ServletException {

logger.info("checking token in filter");
HttpServletRequest request = (HttpServletRequest) arg0;
DocVerificationRequestWrapper myRequestWrapper = new DocVerificationRequestWrapper((HttpServletRequest) request);
String body = myRequestWrapper.getBody();
Token token = null;
try {
JSONObject jsonObj = new JSONObject(body);
JSONObject tokenObj = (JSONObject) jsonObj.get("token");
Gson gson = new Gson();
token = gson.fromJson(tokenObj.toString(), Token.class);

if(null != token) {
if(userVerificationService==null){
ServletContext servletContext = request.getServletContext();
WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
userVerificationService = webApplicationContext.getBean(UserVerificationService.class);
}
String verStatus = userVerificationService.verifyUser(token);
logger.info("verStatus = "+verStatus);
if(verStatus != null && verStatus.equalsIgnoreCase("success")) {
chain.doFilter(request, response);
}else
logger.error("Invalid token");
}else {
logger.error("token missing.");
}
} catch (JSONException e) {
logger.error("exception in authetication filter " + e);
}
}

@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub

}

}

这是 HttpServletRequestWrapper 实现类:

public class DocVerificationRequestWrapper extends HttpServletRequestWrapper {
private final String body;
public DocVerificationRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
throw ex;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
throw ex;
}
}
}
body = stringBuilder.toString();
}

@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
ServletInputStream servletInputStream = new ServletInputStream() {
public int read() throws IOException {
return byteArrayInputStream.read();
}

@Override
public boolean isFinished() {
// TODO Auto-generated method stub
return false;
}

@Override
public boolean isReady() {
// TODO Auto-generated method stub
return false;
}

@Override
public void setReadListener(ReadListener listener) {
// TODO Auto-generated method stub

}
};
return servletInputStream;
}

@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(this.getInputStream()));
}

public String getBody() {
return this.body;
}
}

有什么建议吗?如何解决此错误?

最佳答案

我想这是因为您传递的是原始请求,而不是将实际的包装器传递给链。试试这个:

if(verStatus != null && verStatus.equalsIgnoreCase("success")) {
chain.doFilter(myRequestWrapper, response);
}

显然,当ObjectMapper尝试读取请求正文时 - 请求输入流已经关闭,因为它已被您的包装器读取。

关于java - HttpMessageNotReadableException : Could not read document: Stream closed;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45839984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com