Jsf 如何使用自定义facelets taglib将事件对象作为参数传递给动态侦听器?

Jsf 如何使用自定义facelets taglib将事件对象作为参数传递给动态侦听器?,jsf,primefaces,facelets,taglib,Jsf,Primefaces,Facelets,Taglib,我正在重构我的代码,以使用自定义facelets标记库来“干燥”我的代码 一切正常,但当我需要参数化ajax侦听器操作时,出现了一个异常: Target Unreachable, identifier 'backingBean' resolved to null: javax.el.PropertyNotFoundException: Target Unreachable, identifier 'backingBean' resolved to null 这是我的密码: index.xht

我正在重构我的代码,以使用自定义facelets标记库来“干燥”我的代码

一切正常,但当我需要参数化ajax侦听器操作时,出现了一个异常:

 Target Unreachable, identifier 'backingBean' resolved to null: javax.el.PropertyNotFoundException: Target Unreachable, identifier 'backingBean' resolved to null
这是我的密码:

index.xhtml

<?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:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:test="http://ericsantanna.com/faceletsTest/jsf/facelets"
>
<h:head>
    <h:outputStylesheet name="tema.css" library="css" />
</h:head>
<h:body>
    <h:form id="testForm">
        <test:faceletsTest
        id="testPickList"
        values="#{controller.pickListData}"
        backingBean="${controller}"
        transferHandle="handleTranferEvent"
        />
    </h:form>

</h:body>
</html>
<ui:composition
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

    <p:pickList
        id="#{id}"
        value="#{values}" 
        var="s"
        itemValue="#{s}"
        itemLabel="#{s}">

        <p:ajax event="transfer" listener="#{backingBean[transferHandle]}" />
    </p:pickList>

</ui:composition>
package com.ericsantanna.faceletEventTest;

import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

import org.jboss.logging.Logger;
import org.primefaces.event.TransferEvent;
import org.primefaces.model.DualListModel;

/**
 * @author Eric Sant'Anna
 *
 */
@RequestScoped
@ManagedBean
public class Controller {

    private DualListModel<String> pickListData = new DualListModel<String>();

    @PostConstruct
    public void init() {
        pickListData.getSource().addAll(Arrays.asList("A", "B", "C"));
    }
//  Show message if uncommented:
//  public void handleTranferEvent() {
//      Logger.getLogger(getClass()).info("Sem argumentos...");
//  }

    public void handleTranferEvent(TransferEvent event) {
        Logger.getLogger(getClass()).info("Você escolheu: " + formatItems(event.getItems()));
    }

    public String formatItems(List<?> list) {
        String result = "";
        for(Object s : list) result += s;
        return result;
    }

    public DualListModel<String> getPickListData() {
        return pickListData;
    }

    public void setPickListData(DualListModel<String> pickListData) {
        this.pickListData = pickListData;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0">
    <namespace>http://ericsantanna.com/faceletsTest/jsf/facelets</namespace>
    <tag>
        <tag-name>faceletsTest</tag-name>
        <source>tags/test/faceletsTest.xhtml</source>
    </tag>
</facelet-taglib>

faceletsTest.xhtml

<?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:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:test="http://ericsantanna.com/faceletsTest/jsf/facelets"
>
<h:head>
    <h:outputStylesheet name="tema.css" library="css" />
</h:head>
<h:body>
    <h:form id="testForm">
        <test:faceletsTest
        id="testPickList"
        values="#{controller.pickListData}"
        backingBean="${controller}"
        transferHandle="handleTranferEvent"
        />
    </h:form>

</h:body>
</html>
<ui:composition
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

    <p:pickList
        id="#{id}"
        value="#{values}" 
        var="s"
        itemValue="#{s}"
        itemLabel="#{s}">

        <p:ajax event="transfer" listener="#{backingBean[transferHandle]}" />
    </p:pickList>

</ui:composition>
package com.ericsantanna.faceletEventTest;

import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

import org.jboss.logging.Logger;
import org.primefaces.event.TransferEvent;
import org.primefaces.model.DualListModel;

/**
 * @author Eric Sant'Anna
 *
 */
@RequestScoped
@ManagedBean
public class Controller {

    private DualListModel<String> pickListData = new DualListModel<String>();

    @PostConstruct
    public void init() {
        pickListData.getSource().addAll(Arrays.asList("A", "B", "C"));
    }
//  Show message if uncommented:
//  public void handleTranferEvent() {
//      Logger.getLogger(getClass()).info("Sem argumentos...");
//  }

    public void handleTranferEvent(TransferEvent event) {
        Logger.getLogger(getClass()).info("Você escolheu: " + formatItems(event.getItems()));
    }

    public String formatItems(List<?> list) {
        String result = "";
        for(Object s : list) result += s;
        return result;
    }

    public DualListModel<String> getPickListData() {
        return pickListData;
    }

    public void setPickListData(DualListModel<String> pickListData) {
        this.pickListData = pickListData;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0">
    <namespace>http://ericsantanna.com/faceletsTest/jsf/facelets</namespace>
    <tag>
        <tag-name>faceletsTest</tag-name>
        <source>tags/test/faceletsTest.xhtml</source>
    </tag>
</facelet-taglib>

Controller.java

<?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:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:test="http://ericsantanna.com/faceletsTest/jsf/facelets"
>
<h:head>
    <h:outputStylesheet name="tema.css" library="css" />
</h:head>
<h:body>
    <h:form id="testForm">
        <test:faceletsTest
        id="testPickList"
        values="#{controller.pickListData}"
        backingBean="${controller}"
        transferHandle="handleTranferEvent"
        />
    </h:form>

</h:body>
</html>
<ui:composition
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

    <p:pickList
        id="#{id}"
        value="#{values}" 
        var="s"
        itemValue="#{s}"
        itemLabel="#{s}">

        <p:ajax event="transfer" listener="#{backingBean[transferHandle]}" />
    </p:pickList>

</ui:composition>
package com.ericsantanna.faceletEventTest;

import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

import org.jboss.logging.Logger;
import org.primefaces.event.TransferEvent;
import org.primefaces.model.DualListModel;

/**
 * @author Eric Sant'Anna
 *
 */
@RequestScoped
@ManagedBean
public class Controller {

    private DualListModel<String> pickListData = new DualListModel<String>();

    @PostConstruct
    public void init() {
        pickListData.getSource().addAll(Arrays.asList("A", "B", "C"));
    }
//  Show message if uncommented:
//  public void handleTranferEvent() {
//      Logger.getLogger(getClass()).info("Sem argumentos...");
//  }

    public void handleTranferEvent(TransferEvent event) {
        Logger.getLogger(getClass()).info("Você escolheu: " + formatItems(event.getItems()));
    }

    public String formatItems(List<?> list) {
        String result = "";
        for(Object s : list) result += s;
        return result;
    }

    public DualListModel<String> getPickListData() {
        return pickListData;
    }

    public void setPickListData(DualListModel<String> pickListData) {
        this.pickListData = pickListData;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0">
    <namespace>http://ericsantanna.com/faceletsTest/jsf/facelets</namespace>
    <tag>
        <tag-name>faceletsTest</tag-name>
        <source>tags/test/faceletsTest.xhtml</source>
    </tag>
</facelet-taglib>
package com.ericsantana.faceleteventest;
导入java.util.array;
导入java.util.List;
导入javax.annotation.PostConstruct;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.RequestScope;
导入org.jboss.logging.Logger;
导入org.primefaces.event.transfervent;
导入org.primefaces.model.DualListModel;
/**
*@作者埃里克·桑塔纳
*
*/
@请求范围
@ManagedBean
公共类控制器{
私有DualListModel pickListData=新的DualListModel();
@施工后
公共void init(){
pickListData.getSource().addAll(Arrays.asList(“A”、“B”、“C”));
}
//如果未注释,则显示消息:
//公共无效handleTranferEvent(){
//getLogger.getLogger(getClass()).info(“Sem arguments…”);
//  }
公共无效handleTranferEvent(TransferEvent事件){
getLogger.getLogger(getClass()).info(“Vocêescolheu:+formatItems(event.getItems()));
}
公共字符串格式项(列表){
字符串结果=”;
对于(对象s:列表)结果+=s;
返回结果;
}
public DualListModel getPickListData(){
返回pickListData;
}
public void setPickListData(DualListModel pickListData){
this.pickListData=pickListData;
}
}
faceletsTest.taglib.xml

<?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:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:test="http://ericsantanna.com/faceletsTest/jsf/facelets"
>
<h:head>
    <h:outputStylesheet name="tema.css" library="css" />
</h:head>
<h:body>
    <h:form id="testForm">
        <test:faceletsTest
        id="testPickList"
        values="#{controller.pickListData}"
        backingBean="${controller}"
        transferHandle="handleTranferEvent"
        />
    </h:form>

</h:body>
</html>
<ui:composition
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

    <p:pickList
        id="#{id}"
        value="#{values}" 
        var="s"
        itemValue="#{s}"
        itemLabel="#{s}">

        <p:ajax event="transfer" listener="#{backingBean[transferHandle]}" />
    </p:pickList>

</ui:composition>
package com.ericsantanna.faceletEventTest;

import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

import org.jboss.logging.Logger;
import org.primefaces.event.TransferEvent;
import org.primefaces.model.DualListModel;

/**
 * @author Eric Sant'Anna
 *
 */
@RequestScoped
@ManagedBean
public class Controller {

    private DualListModel<String> pickListData = new DualListModel<String>();

    @PostConstruct
    public void init() {
        pickListData.getSource().addAll(Arrays.asList("A", "B", "C"));
    }
//  Show message if uncommented:
//  public void handleTranferEvent() {
//      Logger.getLogger(getClass()).info("Sem argumentos...");
//  }

    public void handleTranferEvent(TransferEvent event) {
        Logger.getLogger(getClass()).info("Você escolheu: " + formatItems(event.getItems()));
    }

    public String formatItems(List<?> list) {
        String result = "";
        for(Object s : list) result += s;
        return result;
    }

    public DualListModel<String> getPickListData() {
        return pickListData;
    }

    public void setPickListData(DualListModel<String> pickListData) {
        this.pickListData = pickListData;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0">
    <namespace>http://ericsantanna.com/faceletsTest/jsf/facelets</namespace>
    <tag>
        <tag-name>faceletsTest</tag-name>
        <source>tags/test/faceletsTest.xhtml</source>
    </tag>
</facelet-taglib>

http://ericsantanna.com/faceletsTest/jsf/facelets
Facelestest
tags/test/faceletsTest.xhtml
为什么p:ajax没有将transfervent添加到操作中?
如何解决这个问题?

这个问题的原因与这里已经回答的相同@BalusC谢谢,这解决了我的问题。Omnifaces真的很方便!