Я пытаюсь прочитать результат рендеринга 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
.
Моя проблема заключается в том, что метод записи вызывается не в правильном порядке, и в итоге окончательная строка смешивается, а не в правильном порядке . Вероятно, это связано с параллелизмом во Freemarker, но я не знаю, как это исправить.