PrettyFaces误差所需的属性(PrettyFaces error with required

2019-07-18 14:02发布

我正在开发使用JSF 2prettyfaces一个Web应用程序。 我批注我的一个@ViewScoped豆漂亮的注解。 这是我有:

@ManagedBean
@ViewScoped
@URLMapping(parentId = "app-list", id = "app-view", pattern = "/detail/#{appId}",
    viewId = "/system/manage_app/content/app_detail/app_detail.xhtml")
public class NavegableAppView extends SystemNavegable {

/**

基本上,显示它安装在我的系统应用程序的细节。 这个bean可以通过两种方式来实例化,通过#{appId} PARAM,这表明我要加载, 不在PARAM,在这种情况下,豆将从恢复此标识的应用程序的ID @SessionScoped豆。

这就是页面如何/system/manage_app/content/app_detail/app_detail.xhtml的管理参数:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui"
template="/templates/general_template.xhtml">

<ui:define name="metadata">
    <f:metadata>
        <f:viewParam id="appId" name="appId"
            value="#{navegableAppView._ParamApp}" required="false" />
        <f:event type="preRenderView"
            listener="#{navegableAppView.initialize}" />
    </f:metadata>
</ui:define>

<ui:define name="general_content">
    <p:panel>
<!--More stuff-->

这里的问题是我想NavegableAppView豆被创建,有或没有PARAM。 我曾尝试这样<p:button value="prueba" outcome="pretty:app-view" />它的工作原理,但限制我做无非成果 ,也<p:commandButton value="prueba2" action="pretty:app-view" ajax="false" />这是相当于调用的操作方法,并返回导航的情况下( 这是我真正想要什么 )。

首先选择正确创建bean并加载从会话中值。 第二种情况,是给我这个错误:

 HTTP 500 - PrettyFaces: Exception occurred while building URL 
 for MappingId < app-view >, Required value < #{appId} > was null

所以我的目标bean是没有得到构造。 我曾尝试手动添加参数导航案例: return pretty:app-view?appId=1和它的作品,但我想目标bean从会议本身的恢复。 我一定要叫重定向或一样,在我的操作方法的东西吗?

集中你的想法。

Answer 1:

所以,你实际上是运行到的PrettyFaces的“边缘”的效果之一。 您所定义的“APPID”参数实际上是处理两个参数名称,也是建立联系的EL豆价值定位。

@URLMapping(parentId = "app-list", id = "app-view", pattern = "/detail/#{appId}",
viewId = "/system/manage_app/content/app_detail/app_detail.xhtml")

当您使用PrettyFaces的回传动作的导航功能,它需要一个EL bean名称。 现在,它只是恰巧,因为你还没有提供一个在你的@URLMapping注解,即PrettyFaces是要尽量尝试使用参数的名称,并希望它可以找到你想要的东西。 在这种情况下,显然,没有豆值叫做#{appId}

你真的将两种类型的功能,试图解决同样的问题。 您<f:metadata><f:viewParam>的定义是这样做PrettyFaces确实有其路径参数和操作方法同样的事情。 您应该使用一种或另一种机制。 如果你真的想将它们混合,然后如你所说,你应该调用实际导航从你<h:commandButton> ,就像这样:

<p:commandButton value="prueba2" action="#{navegableAppView.goToAppId}" ajax="false" />

然后,你需要确保你返回一个有效的JSF2导航字符串的appId参数,如:

public String goToAppId() {
    return "/system/manage_app/content/app_detail/app_detail.xhtml?faces-redirect=true&appId=" + appId";
}

然后PrettyFaces会明白,你将会重定向到已被映射到URL,并将该URL执行出站重写,并送你到正确的, /detail/#{addId}代替。 这是所有的文档。

最后的选择将简单地除去<f:metadata><f:viewParam>并使用内置的PrettyFaces功能用于管理视图参数来代替。 简单地删除元数据和更新@URLMapping到这一点,将解决你的问题:

@ManagedBean
@ViewScoped
@URLMapping(parentId = "app-list", id = "app-view", pattern = "/detail/#{appId : navegableAppView._ParamApp}",
viewId = "/system/manage_app/content/app_detail/app_detail.xhtml")
public class NavegableAppView extends SystemNavegable {

@URLAction
public String initialize() {
if ( appId != null ) {
      this.item = appsDB.findById(appId);
      return null;
    }

    // Add a message here, "The item {..} could not be found."
    return "pretty:app-list";
}

这是您使用PrettyFaces如何初始化页面。 当它发生的时候,如果你使用的是pretty:mappingId导航,你应该使用PrettyFaces功能。 如果你打算在那里你指定的view-id和URL的所有参数正常使用JSF2式的导航,然后你,你在你的URL映射使用命名路径参数可以混合和匹配(只要。

我希望这有帮助。



文章来源: PrettyFaces error with required attribute