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