Я запускаю Tomcat 7, JSF 2.2, OpenWebBeans 1.6, Omnifaces 1.8 и Richfaces 3. Недавно я добавил Omnifaces CombinedResourceHandler, и заметил, что он вызывает метод значения datatable, несмотря на то, что метод находится в незагруженном блоке, когда отправляется форма на странице.Использование Richfaces и Omnifaces CombinedResourceHandler приводит к h: метод valueTable получает вызов несмотря на rendered = "false"
Пример:
<h:body styleClass="bdyPage">
<h:form id="form">
<h:commandButton value="test button" />
<h:panelGroup rendered="false">
<h:outputText value="#{testBean.getTestString()}" />
<h:dataTable id="testtable22" value="#{testBean.strings}" var="str"
rowClasses="odd, even">
<h:column>
<f:facet name="header">
test
</f:facet>
<h:outputText value="str" />
</h:column>
</h:dataTable>
</h:panelGroup>
</h:form>
</h:body>
У меня есть простой тест фасоли:
@Named("testBean")
@RequestScoped
public class TestBean1 implements Serializable {
private static final long serialVersionUID = 1L;
public String getTestString() {
System.out.println("Test string");
return "test string";
}
public List<String> getStrings() {
List<String> strings = new ArrayList<String>();
strings.add("hej");
strings.add("hejsan");
strings.add("hej hej!");
System.out.println("getting strings");
return strings;
}
}
Обычно getStrings() не вызывается, потому что panelGroup установлен в положение не может быть оказана. Однако, когда я запускаю и Omnifaces CombinedResourceHandler и Richfaces, getStrings() вызывается, когда кнопка отправки нажата более одного раза. Это только влияет на атрибут value компонента h: dataTable. Другие выражения el не вызываются.
Я создал небольшой пример проект со следующим dependices Maven:
<dependencies>
<dependency>
<groupId>org.richfaces.ui</groupId>
<artifactId>richfaces-components-ui</artifactId>
<version>4.3.7.Final</version>
</dependency>
<dependency>
<groupId>org.richfaces.core</groupId>
<artifactId>richfaces-core-impl</artifactId>
<version>4.3.7.Final</version>
</dependency>
<!-- <dependency>
<groupId>org.richfaces</groupId>
<artifactId>richfaces</artifactId>
<version>5.0.0.Alpha3</version>
</dependency>
-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
<type>jar</type>
<classifier>sources</classifier>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.omnifaces</groupId>
<artifactId>omnifaces</artifactId>
<version>1.8</version>
</dependency>
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.apache.openwebbeans</groupId>
<artifactId>openwebbeans-impl</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.openwebbeans</groupId>
<artifactId>openwebbeans-jsf</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.openwebbeans</groupId>
<artifactId>openwebbeans-el22</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.openwebbeans</groupId>
<artifactId>openwebbeans-web</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.2.6</version>
</dependency>
</dependencies>
Я не использую никаких RichFaces компонентов в проекте или на тестовой странице. Я просто включаю Richfaces как зависимость. У меня нет javascripts, которые объединяются. Если я отключу Omnifaces CRH или удалю Richfaces из файла pom, он работает так, как ожидалось.
Я попытался использовать Richfaces 5, но я получаю подобное поведение (хотя геттер называется меньше). Я не пробовал последнюю версию Omnifaces, так как она несовместима с OWB 1.6.
Anoter point of interest может отличаться от того, что если я окружаю данные с помощью JSTL <c:if>
, он работает. Но я не хочу этого делать, очевидно ...
Я делаю что-то неправильно здесь? Есть ли проблема совместимости между этими версиями Omnifaces CRH и Richfaces?
Edit: Стек вызовов из геттер в DataTable в
TestBean1.getStrings() line: 33
TestBean1$$OwbNormalScopeProxy0.getStrings() line: not available
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: not available
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: not available
Method.invoke(Object, Object...) line: not available
BeanELResolver.getValue(ELContext, Object, Object) line: 87
DemuxCompositeELResolver._getValue(int, ELResolver[], ELContext, Object, Object) line: 176
DemuxCompositeELResolver.getValue(ELContext, Object, Object) line: 203
AstValue.getValue(EvaluationContext) line: 183
ValueExpressionImpl.getValue(ELContext) line: 185
WrappedValueExpression.getValue(ELContext) line: 70
TagValueExpression.getValue(ELContext) line: 109
ComponentStateHelper.eval(Serializable, Object) line: 194
ComponentStateHelper.eval(Serializable) line: 182
HtmlDataTable(UIData).getValue() line: 732
HtmlDataTable(UIData).getDataModel() line: 1822
HtmlDataTable(UIData).setRowIndexWithoutRowStatePreserved(int) line: 484
HtmlDataTable(UIData).setRowIndex(int) line: 473
HtmlDataTable(UIData).visitColumnsAndColumnFacets(VisitContext, VisitCallback, boolean) line: 2104
HtmlDataTable(UIData).visitTree(VisitContext, VisitCallback) line: 1446
HtmlPanelGroup(UIComponent).visitTree(VisitContext, VisitCallback) line: 1701
HtmlForm(UIComponent).visitTree(VisitContext, VisitCallback) line: 1701
HtmlForm(UIForm).visitTree(VisitContext, VisitCallback) line: 371
HtmlBody(UIComponent).visitTree(VisitContext, VisitCallback) line: 1701
UIViewRoot(UIComponent).visitTree(VisitContext, VisitCallback) line: 1701
FaceletViewHandlingStrategy.locateComponentByClientId(FacesContext, String) line: 2082
FaceletViewHandlingStrategy.reapplyDynamicRemove(FacesContext, ComponentStruct) line: 2174
FaceletViewHandlingStrategy.reapplyDynamicActions(FacesContext) line: 2116
FaceletViewHandlingStrategy.buildView(FacesContext, UIViewRoot) line: 966
RenderResponsePhase.execute(FacesContext) line: 99
RenderResponsePhase(Phase).doPhase(FacesContext, Lifecycle, ListIterator<PhaseListener>) line: 101
LifecycleImpl.render(FacesContext) line: 219
FacesServlet.service(ServletRequest, ServletResponse) line: 647
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 305
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 210
StandardWrapperValve.invoke(Request, Response) line: 222
StandardContextValve.invoke(Request, Response) line: 123
NonLoginAuthenticator(AuthenticatorBase).invoke(Request, Response) line: 472
StandardHostValve.invoke(Request, Response) line: 171
ErrorReportValve.invoke(Request, Response) line: 99
AccessLogValve.invoke(Request, Response) line: 936
StandardEngineValve.invoke(Request, Response) line: 118
CoyoteAdapter.service(Request, Response) line: 407
Http11Processor(AbstractHttp11Processor).process(SocketWrapper<S>) line: 1004
Http11Protocol$Http11ConnectionHandler(AbstractProtocol$AbstractConnectionHandler).process(SocketWrapper<S>, SocketStatus) line: 589
JIoEndpoint$SocketProcessor.run() line: 312
ThreadPoolExecutor(ThreadPoolExecutor).runWorker(ThreadPoolExecutor$Worker) line: not available
ThreadPoolExecutor$Worker.run() line: not available
TaskThread(Thread).run() line: not available [local variables unavailable]
Последняя версия RichFaces - это 4.5.11.Final (5.x была отменена), а не то, что я думаю, что это помогает. Вызов геттера, безусловно, не нужен, но вызывает ли это какие-либо проблемы? – Makhiel
Фигурное я должен ответить вам также! Даже если мы исправим плохо сконструированные геттеры, это может привести к проблемам с производительностью, если @PostConstructs вызывается чаще, чем ожидалось. Скорее всего, это будет огромная проблема ... но это кажется очень ненужным. – Robin