2013-10-02 6 views
2

Я только что обновил компонент SessionScoped до OmniFaces (1.6.1) ViewScoped. Все, кажется, работает для того, что я получаю следующее исключение, когда моя поддержка боб вводится в сервлет, который я использую для обработки с помощью Ajax запроса, за исключением:ContextNotActiveException, когда OmniFaces ViewScoped bean вводится в сервлет

org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type org.omnifaces.cdi.ViewScoped 

Некоторые вещи, чтобы рассмотреть следующие вопросы:

1) Причина, по которой я должен вставить базовый компонент в сервлет, заключается в том, что я использую плагин DataTables jQuery, который (для таблиц обработки на стороне сервера) требует запроса ajax для извлечения данных таблицы. Поэтому в принципе я не могу использовать Primefaces '<p:remoteCommand..> или что-то в этом роде.

2) Из того, что я могу сказать, нет никаких дополнительных запросов GET для представления, которые разрушали бы и воссоздавали бэк-файл.

Есть ли что-нибудь еще, что может вызвать это исключение? Кроме того, если этого не может быть сделано, есть ли другой способ добиться того, что я делаю?

ответ

3

Аннотации @ViewScoped связывают боб со специфическим видом JSF, который, в свою очередь, зависит от наличия FacesContext#getViewRoot() и последующего UIViewRoot#getViewMap(). Ни один из них не доступен в сервлете «простой ваниль». Нет никакого средства представления JSF внутри простого запроса сервлета, не говоря уже о контексте JSF. Так, к сожалению, это поведение «по дизайну».

Вы имеете в основном 2 варианта:

  1. магазин желаемая делились информацией в рамках сеанса, который вводится с помощью уникального ключа, который передается в качестве параметра вокруг запроса HTTP, так что как JSF управляемый компонент и сервлет может захватить его из области сеанса.

    E.g. в JSF резервного боб:

    dataId = UUID.randomUUID().toString(); 
    externalContext.getSessionMap().put(dataId, data); 
    

    В представлении JSF:

    <h:outputScript>var dataId = "#{bean.dataId}";</h:outputScript> 
    

    В JavaScript:

    function loadData() { 
        $.get("servletURL", { dataId: dataId }, function(response) { 
         // ... 
        }); 
    } 
    

    В сервлета:

    String dataId = request.getParameter("dataId"); 
    Data data = (Data) session.getAttribute(dataId); 
    

  2. Используйте настоящий бэк-код JSF вместо обычного серфинга ванили. Вы можете определенно использовать для этого <p:remoteCommand>. Вы можете использовать метод RequestContext#addCallbackParam() в действии (слушателе) для «передачи» («печать» технически более корректна) объект JSON от Java до JS и, наконец, использовать атрибут oncomplete для его обработки. Учитывая, что вы используете OmniFaces, <o:commandScript> и Ajax#data() предлагает такую ​​же функциональность. У Ajax#data() есть дополнительное преимущество в том, что он автоматически преобразует Java в JSON, так что вам не нужно делать это самостоятельно.

    E.g.с точки зрения JSF:

    <o:commandScript name="loadData" action="#{bean.loadData}" oncomplete="processData()" /> 
    

    В JSF бэк-боба:

    public void loadData() { 
        Ajax.data(data); 
    } 
    

    В JavaScript:

    function processData() { 
        var data = OmniFaces.Ajax.data; 
        // ... 
    } 
    
+0

Проблема # 2 является то, что Javascript, который посылает запрос отправляется с помощью плагина datatables. Поэтому, чтобы настроить его, я бы сделал что-то вроде этого, как описано здесь: http://datatables.net/examples/data_sources/server_side.html. Поэтому я не знаю, могу ли я вызвать метод loadData(). Я либо должен будет отключить плагин, либо переписать, как работает таблица, либо пойти с №1, как вы предлагаете, что, вероятно, будет подходом, который мне придется принять. Спасибо за быстрый ответ! –

+0

Я не знаком с этим ('' с ленивой моделью данных намного проще), но не могли бы вы просто дать ему имя функции, которое нужно вызвать? – BalusC

+0

При создании экземпляра плагина одним из параметров является URL-адрес, передаваемый в виде строки, которую плагин использует для вызова запроса ajax. Поэтому я не думаю, что передача функции будет работать (если она не работает, и я пропустил это в документации). Я попробую. –

Смежные вопросы