Java JSF Flash参数未转入下一个视图(浏览器URL中无?faces redirect=true)

Java JSF Flash参数未转入下一个视图(浏览器URL中无?faces redirect=true),java,jsf,jsf-2,post-redirect-get,view-scope,Java,Jsf,Jsf 2,Post Redirect Get,View Scope,我们有一个包含命令链接的页面: 这应该重定向到结果管理器视图,秘密地传递一个包含表示TODO和DONE的两个状态标志的列表,以便将过滤器设置为所有状态 ResultManagerDashboardHelper.java: 调用searchInitialize方法,该方法应该从ResultManagerFilterHandler bean中提取存储的状态标志。然而,闪光的争论并不存在: 18:58:42,840 INFO [] (134) Setting flash secret args

我们有一个包含命令链接的页面:

这应该重定向到结果管理器视图,秘密地传递一个包含表示TODO和DONE的两个状态标志的列表,以便将过滤器设置为所有状态

ResultManagerDashboardHelper.java:

调用searchInitialize方法,该方法应该从ResultManagerFilterHandler bean中提取存储的状态标志。然而,闪光的争论并不存在:

18:58:42,840 INFO    [] (134) Setting flash secret args to [TODO, DONE]
18:58:42,840 INFO    [] (134) Redirecting from '/view/dashboard' to '/view/resultmgmt/resultManager?faces-redirect=true'
18:58:43,039 INFO    [] (135) ResultManagerFilterHandler: NO secret arguments have arrived via JSF Flash!
18:58:44,350 INFO    [] (135) ResultManager statusFlags = []
18:58:44,350 INFO    [] (135) Non-flash search!
问:

我做错了什么?我如何让它工作

请注意?faces redirect=true URL参数未附加到URL。。。我想知道为什么??这可能是空闪光的原因吗?还是正常的行为

我们使用的是Mojarra 2.1.22,众所周知它在延长Flash实例的使用时间方面存在一些问题,但这是我稍后要解决的问题

PS:很抱歉这个复杂的例子,实际上它更复杂…:-/


PPS:噢,不要介意@Named和@ViewScoped的组合,我们使用的是Seam 3,它用一个兼容CDI的JSF@ViewScoped替换了它。

首先,我建议您不要对同一个视图使用两个@ViewScoped bean。您可以通过将ResultManager FilterHandler的功能性携带到ResultManager来实现此功能。但是,如果您想在其他bean中重用ResultManagerFilterHandler方法,只需使用一个不由JSF管理的普通类,并使托管bean从中扩展即可

另一方面,使用2.1.22已经没有意义了。只需使用最新的2.1.x branch版本,它将与您拥有的代码完全兼容,并带来许多错误修复,特别是与flash scope相关的修复

与faces redirect=true相关,请记住,faces Servlet在将重定向url发送到浏览器之前会对其进行处理。此参数仅告诉您要执行重定向,servlet将在评估后将其删除

另见:

@Named
@ViewScoped
public class ResultManagerFilterHandler
{
    ...

    // status flags secretly coming in via Flash from dashboard
    private List<String> secretStatusFlags;

    @Override
    @PostConstruct
    public void init()
    {
        ...

        @SuppressWarnings( "unchecked" )
        List<String> secretStatusFlags = ( List<String> ) FacesContext.getCurrentInstance().getExternalContext().getFlash().get( ResultManagerDashboardHelper.SECRET_ARGS_KEY );

        if ( secretStatusFlags != null )
        {
            System.out.println( "ResultManagerFilterHandler secret arguments have arrived via JSF Flash! Size = " + secretStatusFlags.size() );
        }
        else
        {
            System.out.println( "ResultManagerFilterHandler: NO secret arguments have arrived via JSF Flash!" );
        }

        // sits in view scope waiting to be picked up by search routine in ResultManager (also view-scoped)
        this.secretStatusFlags = secretStatusFlags;
    }
}
@Named
@ViewScoped
public class ResultManager
{
    ...

    @Inject
    private ResultManagerFilterHandler filterHandler;

    @Override
    public void searchInitially()
    {
        // get Flash object from filter handler
        List<String> statusFlags = this.getFilterHandler().getSecretStatusFlags();

        System.out.println( "ResultManager statusFlags = " + statusFlags );

        // if flash args have been passed, prefer that view over the standard one
        if ( statusFlags != null && !statusFlags.isEmpty() )
        {
            System.out.println( "Flash search!" );

            // set to today and decrypt the passed status flags (this is supposed to override the default search filter!)
            this.filterHandler.setSelectedPeriod( EPeriod.TODAY );
            this.filterHandler.calculateBeginEndDates( this.filterHandler.getSelectedPeriod() );
            this.filterHandler.setTodoOnly( statusFlags.size() == 1 && statusFlags.get( 0 ).equals( "TODO" ) );

            this.search();
        }
        else
        {
            System.out.println( "Non-flash search!" );

            super.searchInitially();
        }
    }
}
18:58:42,840 INFO    [] (134) Setting flash secret args to [TODO, DONE]
18:58:42,840 INFO    [] (134) Redirecting from '/view/dashboard' to '/view/resultmgmt/resultManager?faces-redirect=true'
18:58:43,039 INFO    [] (135) ResultManagerFilterHandler: NO secret arguments have arrived via JSF Flash!
18:58:44,350 INFO    [] (135) ResultManager statusFlags = []
18:58:44,350 INFO    [] (135) Non-flash search!