gpt4 book ai didi

java - 将 ServletOutputStream 读取为字符串

转载 作者:搜寻专家 更新时间:2023-10-31 20:14:53 26 4
gpt4 key购买 nike

我正在尝试读取 FreemarkerView 渲染的结果:

View view = viewResolver.resolveViewName(viewName, locale);
view.render(model, request, mockResponse);

为了读取结果,我创建了 mockResponse,它封装了 HttpServletResponse:

public class HttpServletResponseEx extends HttpServletResponseWrapper {

ServletOutputStream outputStream;

public HttpServletResponseEx(HttpServletResponse response) throws IOException {
super(response);
outputStream = new ServletOutputStreamEx();
}

@Override
public ServletOutputStream getOutputStream() {
return outputStream;
}

@Override
public PrintWriter getWriter() throws IOException {
return new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"));
}
}

还有我的 ServletOutputStream,它使用 StringBuilder 构建字符串:

public class ServletOutputStreamEx extends ServletOutputStream {

StringBuilder stringBuilder;

public ServletOutputStreamEx() {
this.stringBuilder = new StringBuilder();
}

@Override
public void write(int b) throws IOException {
}

@Override
public void write(byte b[], int off, int len) throws IOException {
stringBuilder.append(new String(b, "UTF-8"));
}

@Override
public String toString() {
return stringBuilder.toString();
}
}

有了这些,我可以使用 ServletOutputStreamEx.toString 方法轻松读取响应。

我的问题是 write 方法没有按正确的顺序调用,最终的字符串混合且顺序不正确。这可能是由 Freemarker 中的并发引起的,但我不知道如何解决它。

最佳答案

感谢您的回复:write(int b) 没有实现,因为它从未被调用过。最后的问题是字节数​​组,里面也包含了前面的String。因此需要将字符串创建为 String(b, off, len, "UTF-8")

关于java - 将 ServletOutputStream 读取为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9656295/

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