2012-06-21 2 views
4

Я пытаюсь создать настраиваемый компонент JSF и добавить к нему выражение метода. Это код моего пользовательского компонента:Как добавить выражение метода к пользовательскому компоненту JSF

@FacesComponent(AjaxCommand2.COMPONENT_TYPE) 
public class AjaxCommand2 extends UIComponentBase { 

    public static final String COMPONENT_TYPE = "local.test.component.AjaxCommand2"; 
    public static final String COMPONENT_FAMILY = "local.test.component.AjaxCommand2"; 

    private MethodExpression listener; 

    public MethodExpression getListener() { 
     return listener; 
    } 

    public void setListener(MethodExpression listener) { 
     this.listener = listener; 
    } 


    @Override 
    public String getRendererType() { 
     return null; 
    } 

    @Override 
    public String getFamily() { 
     return COMPONENT_FAMILY; 
    } 
} 

Это мой тег Lib файл:

<?xml version="1.0" encoding="UTF-8"?> 
<facelet-taglib id="test" 
       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://local.test/ui</namespace> 

    <tag> 
     <tag-name>ajaxCommand2</tag-name> 
     <component> 
      <component-type>local.test.component.AjaxCommand2</component-type> 
     </component> 
     <attribute> 
      <name>listener</name> 
      <required>false</required> 
      <type>javax.el.MethodExpression</type> 
     </attribute> 
    </tag> 
</facelet-taglib> 

И это соответствующий код на странице JSF:

<test:ajaxCommand2 listener="#{testSessionBean.testActionAjax}" /> 

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

Я не вижу проблемы. Любая идея ?, Я бы хотел, чтобы свойство listener указывало на конкретный метод одного поддерживаемого компонента.

ответ

1

Написать Handler для компонента, как это:

public class MoveHandler extends ComponentHandler { 
    public MoveHandler(ComponentConfig config) { 
     super(config); 
    } 

    @Override 
    protected MetaRuleset createMetaRuleset(Class type) { 
     MetaRuleset metaRuleset = super.createMetaRuleset(type); 
     MetaRule metaRule = new MethodRule("listener", void.class, new Class[] {MoveEvent.class}); 
     metaRuleset.addRule(metaRule); 
     return metaRuleset; 
    } 
} 
Смежные вопросы