Java 8 default method throws EL PropertyNotFoundException (Wildfly 14, Java EE 8, JSF 2.3)
kwutzke Nov 2, 2018 7:02 AMI have a Java 8 interface for managing instances read from the DB, e.g. in a JSF datatable.
public interface Manager<T> extends Serializable { public List<T> getEntities(); public void setEntities( List<T> entities ); // another default method default public void clearEntities() { this.setEntities( null ); } ... // this is what it is all about default public boolean isReadOnly() { // user can generally create new entities... return false; } }
Base class is:
public abstract class BaseManager<T> implements Manager<T> { private static final long serialVersionUID = 1L; protected List<T> entities; @Override public List<T> getEntities() { return this.entities; } @Override public void setEntities( List<T> entities ) { this.entities = entities; } ... }
Implementing class:
@Named @ViewScoped public class UserManager extends BaseManager<User> { private static final long serialVersionUID = 1L; // assume working CDI EJB @Inject private UserService userService; @PostConstruct @Override public void init() { // load on init try { this.setEntities( this.userService.findAll() ); } catch ( RetrieveException e ) { e.printStackTrace(); } } ... }
The page with the datatable looks like this:
<p:dataTable id="data"
widgetVar="userDataTable"
value="#{userManager.entities}"
var="usr"
rowKey="#{usr.id}"
selection="#{userManager.selectedEntity}"
selectionMode="single"
emptyMessage="No users found.">
<f:facet name="header">
<h:panelGroup id="header"
layout="block">
<p:commandButton id="add-user-button"
icon="ui-icon ui-icon-document"
value="Add user"
action="#{userManager.add()}"
process="@this"
update=":content-form"
disabled="#{userManager.readOnly}">
</p:commandButton>
</h:panelGroup>
</f:facet>
</p:dataTable>
When rendering this, I get a PropertyNotFoundException on the call to the Java 8 default method `isReadOnly()` (disabled attribute):
01:13:53,315 FATAL [javax.enterprise.resource.webcontainer.jsf.context] (default task-1) JSF1073: javax.el.PropertyNotFoundException caught during processing of RENDER_RESPONSE 6 : UIComponent-ClientId=, Message=/home.xhtml @94,72 disabled="#{userManager.readOnly}": The class 'org.project.myone.view.UserManager' does not have the property 'readOnly'. 01:13:53,316 FATAL [javax.enterprise.resource.webcontainer.jsf.context] (default task-1) /home.xhtml @94,72 disabled="#{userManager.readOnly}": The class 'org.project.myone.view.UserManager' does not have the property 'readOnly'.: javax.el.PropertyNotFoundException: /home.xhtml @94,72 disabled="#{userManager.readOnly}": The class 'org.project.myone.view.UserManager' does not have the property 'readOnly'. at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:117) at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:200) at javax.faces.component.html.HtmlCommandButton.isDisabled(HtmlCommandButton.java:197) at org.primefaces.component.commandbutton.CommandButtonRenderer.encodeMarkup(CommandButtonRenderer.java:68) at org.primefaces.component.commandbutton.CommandButtonRenderer.encodeEnd(CommandButtonRenderer.java:54) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:949) at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:317) at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:114) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:918) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1905) at org.primefaces.component.datatable.DataTableRenderer.encodeFacet(DataTableRenderer.java:1467) at org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:351) at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:94) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:949) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1912) at javax.faces.render.Renderer.encodeChildren(Renderer.java:176) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:918) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1905) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1908) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1908) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:491) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:194) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:151) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:151) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:126) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:223) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:671) at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74) at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129) at io.opentracing.contrib.jaxrs2.server.SpanFinishingFilter.doFilter(SpanFinishingFilter.java:55) at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61) at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131) at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84) at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68) at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132) at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64) at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60) at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77) at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50) at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292) at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81) at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138) at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135) at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48) at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43) at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502) at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272) at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81) at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104) at io.undertow.server.Connectors.executeRootHandler(Connectors.java:360) at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830) at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378) at java.lang.Thread.run(Thread.java:748) Caused by: javax.el.PropertyNotFoundException: The class 'org.project.myone.view.UserManager' does not have the property 'readOnly'. at javax.el.BeanELResolver.getBeanProperty(BeanELResolver.java:568) at javax.el.BeanELResolver.getValue(BeanELResolver.java:229) at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:180) at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:208) at com.sun.el.parser.AstValue.getValue(AstValue.java:139) at com.sun.el.parser.AstValue.getValue(AstValue.java:203) at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:226) at org.jboss.weld.module.web.el.WeldValueExpression.getValue(WeldValueExpression.java:50) at org.jboss.weld.module.web.el.WeldValueExpression.getValue(WeldValueExpression.java:50) at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:115) ... 74 more
I checked the JSF version via:
JSF Version = #{facesContext.class.package.implementationTitle} #{facesContext.class.package.implementationVersion}
Output is:
`JSF Version = Mojarra 2.3.5.SP2`
It all happens on Wildfly 14, faces-config version is 2.3.
QUESTION:
What's wrong? Why is JSF 2.3 complaining about a Java 8 default method here? I thought JSF 2.3 is Java-8-ready...
Note:
From the stacktrace it appears to be an EL problem. But why is Wildfly 14 EL complaining? I assume it has the latest EL.
My web.xml has the following content:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
...
<context-param>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>avalon-#{uiHelper.themeColor}</param-value>
</context-param>
<context-param>
<param-name>primefaces.FONT_AWESOME</param-name>
<param-value>true</param-value>
</context-param>
</web-app>
Can anybody help please?
Thanks
Karsten
PS: The JS text tool here to write postings, especially the language formatting, is really bad. It swallows code and formatting doesn't work 100%.