1

我正在尝试 MyFaces CODI 的精彩功能。一个非常有用的东西是类型安全导航。我可以像这样在我的控制器 bean 中指定操作方法的结果:

public Class<? extends ViewConfig> goBack() {
    return Pages.ListView.class;
}

这真的很酷,因为每个开发 IDE 的过度重构能力。

但是当我想使用这个功能时,我在将 viewParameter 传递给下一个视图时遇到了问题。我必须使用命令按钮来调用此操作方法,如下所示:

<h:commandButton id="backButton" value="#{msgs.Button_Back}" 
action="#{viewBean.goBack()}" />

如果我使用此命令按钮,我将无法传递参数。“正常”按钮或链接可以做到这一点:

<h:button id="backButton" value="#{msgs.Button_Back}" outcome="siteBefore.xhtml">
   <f:param name="itemId" value="5" />
</h:button>

缺点是“普通”按钮不使用操作方法,因此我无法参与 CODI 类型安全导航的优势。

那么有没有可能将这两个功能结合起来呢?(传递视图参数并使用类型安全导航)

提前致谢!

4

2 回答 2

1

他们实现了您正在寻找的东西。见https://issues.apache.org/jira/browse/EXTCDI-216

于 2011-08-19T16:41:07.110 回答
0

@史蒂文R

CODI 不支持在使​​用类型安全导航时包含 viewParams,但是如果您遵循他们的问题跟踪系统,这似乎是一个预期功能:

https://issues.apache.org/jira/browse/EXTCDI-171

从问题的历史记录中,您可以看出他们最近(约 4 周前)刚刚更新了状态,并且可能很快就会包含在内。也许其中一位提交者正在关注这篇文章,并且可以为我们更新这个新功能的粗略时间表?

此外,JSF 规范中已经讨论了类型安全导航的特性:

http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-977

作为一种解决方法,我建议遵循 CODI wiki 中的提示(请参阅下面的部分 URL),并使用Pages.ListView.class.getName()可以在支持 bean 的操作方法中连接其他 viewParams 的地方。这样,您的导航是类型安全的,并且您可以利用 IDE 的重构功能。这种方式只有参数不会是类型安全的......

我建议你使用<f:attribute/>标签,所以你不必像这样走低谷

String viewParam = "";
for (UIComponent comp : event.getComponent().getChildren()) {
   if (comp instanceof UIParameter ) {
      UIParameter myParameter = (UIParameter) comp;
    if (myParameter.getName().equals("myParameterName")) {
        viewParam = myParameter.getValue());
    }
}
}
// add your viewParam to the navigation string here

这里的缺点是在代码深处某处参数的硬编码名称。因此,一旦 CODI 带有新功能,重构可能是值得的

cwiki.apache.org/EXTCDI/jsf-usage.html#JSFUsage-TypesafeNavigation

于 2011-08-08T19:03:20.517 回答