2013-11-26 2 views
4

В данном случае я хочу использовать facelet с различным ManagedBeans, поэтому в отношении действий боба даются в качестве параметра:Managed Bean в качестве параметра Facelet позволяет составной компонент предотвращает разрешения

<?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> 

Я давая действие create как параметр value="#{myOneCreateAction}".

Внутри этого лицевого элемента также используется несколько раз на других страницах, поэтому я пытаюсь реорганизовать его в составном компоненте.

<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> 

и последнее, но не в последнюю очередь, управляемого компонента

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} он работает, как и ожидалось.

Кто-нибудь видел это раньше? Я слепой? Известны любые обходные ...? Заранее спасибо!

+0

Хорошо объяснил и составил. Хорошо сделано для первого попадания ;-) Вы, кстати, посмотрели [это] (http://stackoverflow.com/a/3707809/1199132)? –

+0

Привет @XtremeBiker и THNX за положительную обратную связь. Хорошо, да, использовал это как ressource, прежде чем писать этот вопрос. Отладил весь метод и ожидал бы, по крайней мере, прыгнуть в него. Но нет, не случилось. :-( –

ответ

1

Как работы вокруг я переписал компонент, чтобы дать боб действий и метод действия в виде двух отдельных параметров их разрешения следующим образом

Xhtml:

<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. Это не выглядит так супер сексуально, но работает. : -/