Проблема с оценкой выражения El в сочетании со швом 3 и составным компонентом JSF2 valueChangeListener

у меня есть следующая конструкция:

@Named    
public class SpecificAction extends BasicAction {

    public void calulateSomething(ValueChangeEvent event) {...}
}

}

@Named
public abstract class BasicAction {
     public void calculateSomething(ValueChangeEvent event) {...}
}

Чем просмотры:

Файл: SpecialAction.xhtml

<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.prime.com.tr/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:cc="http://java.sun.com/jsf/composite/cc"
      xml:lang="de" lang="de">
    <ui:composition template="/BasicAction.xhtml">
        <ui:param name="basicAction" value="#{specificAction}" />
....
</ui:composition>

The BasicAction.xhtml contains my Composite Component:

<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.prime.com.tr/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:cc="http://java.sun.com/jsf/composite/cc"
      xmlns:gui="http://java.sun.com/jsf/composite/gui">
     <gui:inplaceInput id="name" valueChangeListener="#{basicAction.calculateSomething}" value=#{bean.name} />
</html>

И композитный компонент:

<composite:interface>
    <composite:attribute name="value" />
    <composite:editableValueHolder name="Value"/>
    <composite:attribute name="valueChangeListener" targets="Value" />
</composite:interface>
<composite:implementation>
      <h:inputText id="Value" value="#{cc.attrs.value}" onblur="handleBlur(this.id);" >
          <composite:insertChildren />
      </h:inputText>
</composite:implementation>

Если я запускаю свое творение, оно отлично работает, если значением el valueChangeListener является «specificAction». Также он отлично работает в basicAction.xhml с выражением «basicAction», только с составным компонентом я получил это забавное исключение:

[ExceptionHandlerFactory] Handling exception javax.faces.event.AbortProcessingException: javax.faces.event.AbortProcessingException: /BasicAction.xhtml @XX,XX valueChangeListener="#{basicAction.calculateSomething}": The class 'SpecificAction' does not have the property 'calculateSomething'.
    at javax.faces.event.MethodExpressionValueChangeListener.processValueChange(MethodExpressionValueChangeListener.java:157) [:2.1.3-FCS]
    at javax.faces.event.ValueChangeEvent.processListener(ValueChangeEvent.java:134) [:2.1.3-FCS]
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769) [:2.1.3-FCS]

Любая идея, что это может быть за хак?
Ошибка в Seam 3 или в JSF2 Framework или какая-то глупая ошибка на моей стороне?

Спасибо за ответы!!!


person javaBeCool    schedule 01.09.2011    source источник
comment
Я не могу воспроизвести вашу проблему на Mojarra 2.1.2. Какую реализацию/версию JSF вы используете? Возможно, это было исправлено в более новой версии. Только обратите внимание, что я не использовал аннотации CDI, только аннотации JSF, но это не должно иметь никакого значения.   -  person BalusC    schedule 02.09.2011
comment
Привет, BalusC, спасибо за тестирование, я попробовал его с Mojarra 2.1.3-FCS (бета-версия 3), и проблема все еще не устранена. Я попробую это при других обстоятельствах без шва 3. Я не могу временно пометить конкретный EL-Validation InterfaceImpl, это может быть JSF, я все еще использую CDI, но не в этом контексте. Другой вопрос: пробовали ли вы или могли бы попробовать это с bean-компонентом с областью видимости (Basic- и SpecificAction)? Большое спасибо!   -  person javaBeCool    schedule 02.09.2011
comment
Я использовал bean-компонент с областью видимости, но область не должна иметь значения. Это ошибка ЭЛ. Я тестировал на Tomcat 7 (Servlet 3.0/EL 2.2). Кстати, я не уверен, разрешено ли это в CDI, но @Named для абстрактного класса не имеет для меня смысла, поскольку его все равно нельзя построить.   -  person BalusC    schedule 02.09.2011
comment
Я использовал его только для компиляции кода в редакторе jboss-xhtml, он стал распознаваться в java. P.S. Спасибо! Хорошо, я попробовал, кстати. я должен использовать взломанный jboss 6. Я знаю, что это не идеальная среда.   -  person javaBeCool    schedule 02.09.2011


Ответы (2)


Это выглядит точно так же, как ошибка, которую вы получаете при попытке передать привязку метода в тег Facelets.

Из-за какой-то неуклюжей ошибки дизайна в Facelets это никогда не работает (что-то связанное только с исключением значений).

Решение состоит в том, чтобы передать bean-компонент и имя метода как отдельные атрибуты. Затем объедините их, используя адресацию в стиле массива: bean[methodName].

Возможно, это также поможет в вашем случае.

Обновление:

В новой служебной библиотеке под названием OmniFaces есть вспомогательный тег, который позволяет вам использовать выражение метода без вышеупомянутого разделения, ищите methodParam.

person Mike Braun    schedule 02.09.2011
comment
Спасибо за предложение, я попробую это в своей системе, и если это управляемое решение, я опубликую свой обходной путь. - person javaBeCool; 02.09.2011
comment
Хорошо, мне любопытно, каково окончательное решение. Ошибка, которую вы получаете, абсолютно вызвана тем, что выражение EL интерпретируется как выражение значения, в то время как оно должно интерпретироваться как выражение метода, - person Mike Braun; 02.09.2011

У меня была та же проблема с разрешением выражения EL как свойства вместо метода, но только для неуправляемых компонентов в Mojarra 2.1.6 ( @BalusC, вероятно, не сталкивался с этим из-за использования управляемого компонента. ).

Решено путем передачи bean-компонента и метода отдельно, как упоминалось Майком:

<composite:attribute name="valueChangeBean" required="true" />
<composite:attribute name="valueChangeMethod" required="true" />
...
<composite:implementation>
    <h:selectBooleanCheckbox
      valueChangeListener="#{cc.attrs.valueChangeBean[cc.attrs.valueChangeMethod]}"
      value="#{cc.attrs.isValue}"/>

Использование страницы:

<name:custom value="#{bean.val}"
             valueChangeBean="#{bean}"
             valueChangeMethod="onValChange" />
person ENG_ACK    schedule 06.03.2013