Как сделать экземпляр facecontext

Я использую springbatch для вызова отчета о яшме с использованием JSF. Проблема в том, что при вызове метода facecontext всегда равен нулю, поэтому я могу получить сеанс. Что касается различных проблем, которые я читал, я понимаю, что проблема в том, что пакетный процесс не входит в жизненный цикл JSF. КАК я могу создать экземпляр FacesContext, чтобы получить информацию о сеансе? Я пытаюсь создать FacesServlet, но я не уверен, в какой момент я могу его вызвать и как получить информацию о запросе и ответе.

  HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        httpServletResponse.addHeader("Content-disposition", "attachment; filename=" + nombreReporte + ".pdf");
        ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
        JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
        FacesContext.getCurrentInstance().responseComplete();

person user3490001    schedule 02.04.2014    source источник
comment
FacesContext разработан как синглтон. Это единственный способ с ним работать. Проблема здесь в том, действительно ли у вас есть контекст сервлета в вашем контексте Spring Batch? Позвольте мне поколебаться. Если у вас его нет, как вы притворяетесь, что имеете доступ к информации HttpSession?   -  person Xtreme Biker    schedule 02.04.2014


Ответы (2)


Самый старый трюк книги. См.: Доступ к FacesContext из сервлета

person lu4242    schedule 02.04.2014
comment
ОП ищет неправильное решение проблемы. Таким образом, OP в конечном итоге требуется дескриптор сеанса HTTP (по какой-то неясной причине). Чтобы получить это, OP сначала нужен дескриптор HTTP-запроса. Создание экземпляра FacesContext вручную не решит проблему лучше, так как для его создания все равно потребуется HTTP-запрос и HTTP-ответ. FacesContext, в конце концов, также является просто оболочкой над API сервлета. Почему бы просто не использовать API сервлетов напрямую, если он уже есть в среде на основе сервлетов? - person BalusC; 03.04.2014
comment
Если у вас есть FacesContext, у вас есть и ExternalContext, а с этим классом у вас есть все остальное. - person lu4242; 03.04.2014

Я публикую код, который я использую для создания JasperReports из моего управляемого компонента, и он работает:

      public ServletContext getContext() {
        return (ServletContext)getFacesContext().getExternalContext().getContext();
    }

    public HttpServletResponse getResponse() {
        return (HttpServletResponse)getFacesContext().getExternalContext().getResponse();
    }

    public static FacesContext getFacesContext() {
        return FacesContext.getCurrentInstance();
    }

    public void generate() {
        HttpServletResponse response =           (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
        ServletOutputStream outStream;

        try {
            outStream = response.getOutputStream();
        } catch (IOException e) {
            _logger.severe("IOException getting outputStream during report generation!!", e);
            e.printStackTrace();
        }
        ServletContext context = getContext();
        InputStream fs = context.getResourceAsStream("/Reports/" + jrxml);

//Following there is a lot of code for generating my custom reports
   ........................

//At the end
   FacesContext.getCurrentInstance().responseComplete();
}
person Endrik    schedule 02.04.2014