Если вы не хотите писать больше данных в ответ, вам не нужно иметь дело с OutputStream. Просто используйте объект ответа:
@Provider
public class SomeFilter implements ContainerResponseFilter {
private Logger LOG = LoggerFactory.getLogger(SomeFilter.class);
@Override
public void filter(ContainerRequestContext requestContext,
ContainerResponseContext responseContext) throws IOException {
LOG.info("response entity: " + responseContext.getEntity());
}
}
OutputStream пуст во время вызова фильтра, потому что время выполнения JAX-RS не записано на него. После вашего фильтра среда выполнения выберет правильный MessageBodyWriter , который будет сериализовать объект в OutputStream.
Вы также можете перехватить все MessageBodyWriters с помощью WriterInterceptor . Следующий пример передает ByteArrayOutputStream в MessageBodyWriter и затем восстанавливает исходный OutputStream:
@Provider
public class ResponseInterceptor implements WriterInterceptor {
private Logger LOG = LoggerFactory.getLogger(ResponseInterceptor.class);
@Override
public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
OutputStream originalStream = context.getOutputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
context.setOutputStream(baos);
try {
context.proceed();
} finally {
LOG.info("response body: " + baos.toString("UTF-8"));
baos.writeTo(originalStream);
baos.close();
context.setOutputStream(originalStream);
}
}
}
Ваш пример не воспроизводим, потому что вы не предоставили данные.
Следующий пример воспроизводим и не дает ошибки.
library(smooth)
forecast(sma(USAccDeaths))
Обратите внимание, что используемая здесь функция forecast
не является частью пакета fpp2. Это из гладкой упаковки.
Чтобы проверить, что происходит с вашим примером:
sma
возвращает что-то разумное. Сообщение об ошибке указывает на то, что функция не возвращает модель, которую она должна.