开发者

Is it possible to call parameterized method-signature inside a composite-component?

im currently creating a JSF composite-component with a method signature that can accept parameters.

Here's the excerpt :

<composite:interface>
    ....
    <composite:attribute name="activateHeroMethod" method-signature="java.util.List action(id.co.sofcograha.core.Dto, id.co.sofcograha.core.Dto)" />
</composite:interface>

<composite:implementation>
    ....
    <p:commandLink value="#{hero.map['heroName']}"
        process="@this"
        update="#{cc.attrs.update}"
        oncomplete="infoRaceDialog.hide()"
        image="ui-icon ui-icon-search">
        <f:setPropertyActionListener value="#{hero}"
            target="#{cc.attrs.activateHeroMethod(infoRaceBean.race, hero)}" />
    </p:commandLink>
    ....
</composite:implementation>

target="#{cc.attrs.activateHeroMethod(infoRaceBean.race, hero)}" fails horribly with the following error message :

javax.faces.view.facelets.TagAttributeException: /resources/sofco/infoRace.xhtml @57,76 target="#{cc.attrs.activateHeroMethod(infoRaceBean.race, hero)}" /resources/sofco/infoRace.xhtml @57,76 target="#{cc.attrs.activateHeroMethod(infoRaceBean.race, hero)}" Illegal attempt to pass arguments to a composite component lookup expression (i.e. cc.attrs.[identifier]).
        at com.sun.faces.facelets.tag.TagAttributeImpl.getValueExpression(TagAttributeImpl.java:401)
        at com.sun.faces.facelets.tag.TagAttributeImpl.getValueExpression(TagAttributeImpl.java:351)
        at com.sun.faces.facelets.tag.jsf.core.SetPropertyActionListenerHandler.applyAttachedObject(SetPropertyActionListenerHandler.java:128)
        at com.sun.faces.facelets.tag.jsf.core.SetPropertyActionListenerHandler.apply(SetPropertyActionListenerHandler.java:101)

Is it possible to call the parameterized method from a composite-component's attribute ? I think i can deal with multiple as a workar开发者_开发问答ound of working with multiple parameters in one method, but i dont like the approach, since it'll grow in size along with the parameters.

I could wrap every params into 1 wrapper object, but im still curious whether there's a way to solve the problem of calling the method with multiple params.

Please share your thoughts !

Thank you.


Yes is possible to do that, do it like this:

<composite:interface displayName="Image uploader with preview list">
        <composite:attribute name="backingBean" required="true" />
        <composite:attribute name="imageType" required="true"  />
</composite:interface>
....
<p:commandButton  value="Save"  actionListener="#{cc.attrs.backingBean.imageUploaded(cc.attrs.imageType)}"/>

Hope this helps some body.


Composite component:

<ui:component
        xmlns="http://www.w3.org/1999/xhtml"
        xmlns:cc="http://java.sun.com/jsf/composite"
        xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
        xmlns:f="http://xmlns.jcp.org/jsf/core"
        xmlns:h="http://xmlns.jcp.org/jsf/html"
        xmlns:p="http://primefaces.org/ui"
>

    <cc:interface>

        <cc:attribute name="header" type="java.lang.String" required="true"/>

        <cc:attribute name="value" required="true"/>
        <cc:attribute name="update" type="java.lang.String" required="false" default=""/>
        <cc:attribute name="controller" required="true"/>

        <cc:attribute name="addLine" required="true" method-signature="void addLine()"/>
        <cc:attribute name="deleteLine" type="java.lang.String" required="true"/>

    </cc:interface>

    <cc:implementation>

        <div id="#{cc.clientId}">

            <p:panel header="#{cc.attrs.header}">

                <p:dataTable id="table" value="#{cc.attrs.value}" var="line">

                    <p:column headerText="#{cc.attrs.header}">
                        <h:outputText value="#{line.entry}"/>
                    </p:column>

                    <p:column width="32">
                        <f:facet name="header">
                            <p:commandButton title="#{msgs.add}" icon="fa fa-plus"
                                             type="button">
                                <f:ajax listener="#{cc.attrs.addLine}" render="#{cc.attrs.update} table"/>
                            </p:commandButton>
                        </f:facet>
                        <p:commandButton title="#{msgs.delete}" icon="fa fa-minus"
                                         type="button">
                            <f:ajax listener="#{cc.attrs.controller[cc.attrs.deleteLine](line)}" render="#{cc.attrs.update} table"/>
                            <p:confirm message="#{msgs.deleteString}" icon="ui-icon-alert"/>
                        </p:commandButton>
                    </p:column>

                </p:dataTable>

            </p:panel>

        </div>

    </cc:implementation>

</ui:component>

Page:

<ui:composition
        xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
        xmlns:any="http://java.sun.com/jsf/composite/components"
>

    <!--@elvariable id="controller" type="org.controllers.AnyController"-->
    <any:row
            header="#{msgs.subjective}"
            value="#{controller.entity.things}"
            update="form:growl form:save"
            controller="#{anyController}"
            addLine="#{anyController.addTheLine}"
            deleteLine="deleteTheLine"/>

</ui:composition>

Controller:

@javax.inject.Named
@javax.enterprise.context.SessionScoped
public class AnyController
{
    ...

    public void addTheLine()
    {
        ...
    }

    public void deleteTheLine(final Line anyLine)
    {
        ...
    }

    ...
}


to any person who has the same problem could try something like this

<composite:attribute name="methodName" method-signature="java.lang.String f(java.lang.String, java.lang.String)" required="false" />
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜