Метод Java 8 по умолчанию выбрасывает PropertyNotFoundException

У меня есть интерфейс Java 8 для управления экземплярами, читаемыми из БД, например, в виде данных JSF.

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;
    }
}

Базовый класс это:

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;
    }

    ...
}

Реализующий класс:

@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();
        }
    }

    ...
}

Страница с данными выглядит следующим образом:

<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>

При рендеринге я получаю исключение PropertyNotFoundException при вызове метода Java 8 по умолчанию isReadOnly() (отключенный атрибут):

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

Я проверил версию JSF через:

JSF Version = #{facesContext.class.package.implementationTitle} #{facesContext.class.package.implementationVersion}

Выход:

JSF Version = Mojarra 2.3.5.SP2

Все это происходит на Wildfly 14, face-config версии 2.3.

ВОПРОС:

В чем дело? Почему JSF 2.3 жалуется на метод Java 8 по умолчанию здесь? Я думал, что JSF 2.3 готов к Java-8...

???

Спасибо

0 ответов

Другие вопросы по тегам