2015-01-16 3 views
2

У меня есть служба, доступ к которой осуществляется сервлетом, который перенаправляет пользователя на экран входа в систему. Область бэкапинга в настоящее время изменена с @ConversationScoped на @FlowScoped, поскольку ее легче обрабатывать.Можно ли запустить поток лиц изнутри сервлета?

Есть ли способ инициализировать поток граней непосредственно изнутри сервлета, без косвенности посредством неявного действия или прямого или переадресации JSF?

Я знаю, что @FlowScope является областью JSF (2.2), и мне было интересно, может ли быть способ, например, расширьте FacesServlet или что-то подобное.

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

Update
Я попробовал много подходов к «автоматически» вперед в потоке, без необходимости нажимать на любую кнопку, но я всегда получаю No active contexts for scope type javax.faces.flow.FlowScoped. Вот мои подходы:

  1. f:viewAction

    <f:metadata> 
        <f:viewAction action="myFlow" /> 
    </f:metadata> 
    

    Это один, кажется, выполняется слишком рано (в любом случае).

  2. f:event

    <f:event type="preRenderView" listener="#{myBean.forwardToMyFlow()}" /> 
    

    Метод в компоненте возвращает тот же результат, как и в f:viewAction.

  3. навигации случай

    <navigation-rule> 
        <from-view-id>/myView.xhtml</from-view-id> 
        <navigation-case> 
        <from-outcome>myFlow</from-outcome> 
        <to-view-id>/myFlow/myFlow.xhtml</to-view-id> 
        <redirect /> 
        <to-flow-document-id /> 
        </navigation-case> 
    </navigation-rule> 
    

Что мне не хватает?

+0

Ничего страшного в том, что перед контроллером есть поток, хотя, если я правильно читаю спецификацию, вы должны иметь возможность напрямую ссылаться на первый вид потока; спецификация говорит, что необходимые '@ FlowScoped' beans должны быть инициализированы при входе в первый узел в потоке – kolossus

+0

@kolossus Спасибо за ваш ответ и извините за задержку, я давно не работал. Я нашел ссылку в спецификации, вы упомянули, но я все еще не мог заставить ее работать. Я всегда получаю «ContextNotActiveException» ... – NanSil

ответ

5

Наконец-то я нашел решение, прочитав спецификации и прокручивая потоки!
Я имею страницу, где я просто:

<f:metadata> 
    <f:viewAction action="#{bean.initFlow}" /> 
</f:metadata> 

До сих пор так хорошо, но фокус находится внутри метода, где вы должны «вручную» инициализировать требуемый поток, выполнив следующие действия:

public String initFlow(){ 
    FacesContext context = FacesContext.getCurrentInstance(); 
    FlowHandler handler = context.getApplication().getFlowHandler(); 
    handler.transition(context, null, handler.getFlow(context, "", "flow-name"), null, ""); 
    return "flow-name"; 
} 

Метод transition «активирует» именованный поток и делает его доступным, чтобы затем вы могли перейти к точке входа потока.
Обратите внимание:, что даже если он выглядит как обычный, viewAction всегда делает переадресацию!

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