所以你实际上遇到了 PrettyFaces 的“边缘”效应之一。您定义的“appId”参数实际上既被视为参数名称,又被视为用于构建链接的 EL bean 值位置。
@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无论如何都会尝试使用参数名称,并希望它能找到你想要的。在这种情况下,显然,没有名为的 bean 值#{appId}
.
您实际上是在混合两种类型的功能来尝试解决同一问题。你的<f:metadata>
and <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>
and <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
导航,你应该only使用 PrettyFaces 功能。如果您打算使用普通的 JSF2 风格的导航,在其中指定 view-id 和 URL 的所有参数,那么您可以混合搭配(只要您使用namedURL 映射中的路径参数。
我希望这有帮助。