jsf - 托管 Bean 作为 Facelet 参数让复合组件阻止解析

标签 jsf jsf-2 facelets composite-component

在给定的情况下,我想使用具有不同 ManagedBeans 的 facelet,因此有关 action-bean 作为参数给出:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" >
<h:body>
    <ui:include src="ratings.xhtml" >
      <ui:param name="createAction" value="#{myOneCreateAction}" />
      <ui:param name="ratings" value="#{context.ratings}" />
    </ui:include>
</h:body>
</html>

我将创建操作作为参数 value="#{myOneCreateAction}" .

在那个 facelet 中,还有一个组件在其他页面上也被多次使用——所以我尝试在一个复合组件中重构它。
<html xmlns="http://www.w3.org/1999/xhtml" 
  xmlns:ui="http://java.sun.com/jsf/facelets" 
  xmlns:h="http://java.sun.com/jsf/html" 
  xmlns:f="http://java.sun.com/jsf/core" 
  xmlns:io="http://java.sun.com/jsf/composite/inoutComponents">
<ui:composition>
    <rich:dataTable id="ratingTblId" 
    value="#{ratings}" 
    var="rating">
        <rich:column>
             <io:removeButton
                 id="removeButton"
                 actionMethod="#{createAction.removeRating}"
                 immediate="true"
                 render=":#{rich:clientId('ratingTblId')}" />

             <h:commandButton
                 id="removeButton2"
                 actionListener="#{createAction.removeRating}"
                 immediate="true" >                    
                    <f:ajax render="ratingTblId" />
              </h:commandButton>
        </rich:column>
</rich:dataTable>
</ui:composition>
</html>

看,该方法是如何给出的 actionMethod="#{createAction.removeRating}"到组件。该组件本身如下所示:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:cc="http://java.sun.com/jsf/composite">
    <!-- INTERFACE -->
    <cc:interface>
        <cc:attribute 
            name="actionMethod" 
            targets="remove" 
            method-signature="void f(javax.faces.event.ActionEvent)"/>
        <cc:attribute name="render" required="false" />
    </cc:interface>

    <!-- IMPLEMENTATION -->
    <cc:implementation> 
        <h:commandButton 
           id="remove"
           actionListener="#{cc.attrs.actionMethod}" 
           onclick="if (!confirm('Do you really?')) { return false; }">
           <f:ajax execute="@this" render="#{cc.attrs.render}" />
        </h:commandButton> 
    </cc:implementation>
</ui:composition>

最后但并非最不重要的是,托管 bean
Name("myOneCreateAction")
@Scope(ScopeType.CONVERSATION)
public class MyOneCreateAction {
   ...
   public void removeRating(ActionEvent ev) {
        // do something
   }
   ...
}

令人惊讶的是,虽然 removeButton2 正确地跳转到了正确的函数中,但复合组件版本返回了一个
javax.faces.event.AbortProcessingException: Target Unreachable, 
      identifier 'createAction' resolved to null

反而。我正在使用 Mojarra JSF 2.1.26 和 Seam 2.3.1.CR1。没有嵌套的复合组件。将复合组件参数替换为 #{myOneCreateAction.removeRating} 时,它按预期工作。

有没有人见过这个?我瞎了吗?任何已知的解决方法......?提前致谢!

最佳答案

作为一种解决方法,我重写了组件,将 action bean 和 action 方法作为两个单独的参数来解析它们,如下所示

html:

<io:removeButton
             id="removeButton"
             actionBean="#{createAction}"
             actionMethod="removeRating"
             immediate="true"
             render=":#{rich:clientId('ratingTblId')}" />

复合组件:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:cc="http://java.sun.com/jsf/composite">
<!-- INTERFACE -->
<cc:interface>
    <cc:attribute name="actionBean" />
    <cc:attribute name="actionMethod" />
    <cc:attribute name="render" required="false" />
</cc:interface>

<!-- IMPLEMENTATION -->
<cc:implementation> 
    <h:commandButton 
       id="remove"
       action="#{cc.attrs.actionBean[cc.attrs.actionMethod]}" 
       onclick="if (!confirm('Do you really?')) { return false; }">
       <f:ajax execute="@this" render="#{cc.attrs.render}" />
    </h:commandButton> 
</cc:implementation>
</ui:composition>

还将操作方法​​签名更改为返回 String而不是 void .这看起来不再那么性感了,但确实有效。 :-/

关于jsf - 托管 Bean 作为 Facelet 参数让复合组件阻止解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20219326/

相关文章:

java - 提交在 <ui :repeat> 内不起作用

jsf - JSF返回带有纯/原始XHTML/XML/EL源的空白/未解析页面,而不是呈现的HTML输出

jsf - 生成要在 Facelets 中显示的链接列表

java - 导航规则/案例问题

jsf - JSF 中未调用操作方法

css - 无法在 JSF 中加载 CSS 图像

jsf-2 - 如何从<ui :repeat>中的jsf页面获取支持Bean的参数

internet-explorer - JSF2.1.7 将 &lt;!--[if IE ]> 标签呈现为文本

spring - 在 JBoss Spring JSF Web 应用程序中配置 https

jsf - Primefaces SelectOneButton : Change individual button styles