簡體   English   中英

javax.el.PropertyNotWritableException:可編輯p:datatable中的java.lang.UnsupportedOperationException

[英]javax.el.PropertyNotWritableException: java.lang.UnsupportedOperationException in editable p:datatable

我正在使用jsf 2.2.18和primefaces 6.2,並嘗試實現一個簡單的可編輯p:datatable ,根據此primefaces展示: https ://www.primefaces.org/showcase/ui/data/datatable/edit.xhtml

問題是我無法檢查對行的修改。

除了一些吸氣劑/裝料器問題(不會導致完全相同的錯誤)之外,互聯網上什么都找不到,我只是想更改訪問器(以防保留字),用#{param.pname}#{param.value}替換#{param.name} #{param.value}#{param.pvalue}沒有結果。

這是我表的代碼:

    <h:form id="params_form" prependId="false">
        <p:panel id="context_parameters" header="Paramètres de contexte">
            <p:dataTable id="params" var="param" value="#{displayEnvController.environment.contextParams}" editable="true" style="margin-bottom:20px">
                <p:ajax event="rowEdit" listener="#{displayEnvController.onRowEdit}" update=":params_form" />
                <p:ajax event="rowEditCancel" listener="#{displayEnvController.onRowCancel}" update=":params_form" />

                <p:column headerText="Nom">
                    <p:cellEditor>
                        <f:facet name="output"><h:outputText value="#{param.name}" /></f:facet>
                        <f:facet name="input"><p:inputText id="paramName" value="#{param.name}" style="width:100%" /></f:facet>
                    </p:cellEditor>
                </p:column>
                <p:column headerText="Valeur">
                    <p:cellEditor>
                        <f:facet name="output"><h:outputText value="#{param.value}" /></f:facet>
                        <f:facet name="input"><p:inputText id="paramValue" value="#{param.value}" style="width:100%" /></f:facet>
                    </p:cellEditor>
                </p:column>
                <p:column style="width:32px">
                    <p:rowEditor />
                </p:column>
            </p:dataTable>
        </p:panel>
    </h:form>

我的控制器:

@Controller
@Scope("view")
public class DisplayEnvController implements Serializable {

    private static final long       serialVersionUID    = 1L;

    private Environment             environment;
    private String                  name;
    @Autowired private DataManager  dataManager;


    /**
     * Called by the view when a parameter is modified.
     * @param event the {@link RowEditEvent} holding the parameter to update
     */
    public void onRowEdit(final RowEditEvent event) {
        dataManager.update((ContextParam) event.getObject());
    }

    public void onRowCancel(final RowEditEvent event) {
        environment.getContextParams().remove(event.getObject());
    }

    /**
     * @return the environment
     */
    public Environment getEnvironment() {
        return environment;
    }

    /**
     * @param environment the environment to set
     */
    public void setEnvironment(final Environment environment) {
        this.environment = environment;
    }

我的“環境” bean:

public class Environment implements Serializable {

    private static final long           serialVersionUID    = 1L;

    private final List<ContextParam>    contextParams       = new ArrayList<>();

    /**
     * @return the contextParams
     */
    public List<ContextParam> getContextParams() {
        return contextParams;
    }

    /**
     * @param params the {@link List} of {@link ContextParam}s to set
     */
    public void setContextParams(final List<ContextParam> params) {
        contextParams.addAll(params);
    }

}

還有我的“ param” bean:

public class ContextParam implements Serializable {

    private static final long   serialVersionUID    = 1L;
    private String              name;
    private String              value;

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(final String name) {
        this.name = name;
    }

    /**
     * @return the value
     */
    public String getValue() {
        return value;
    }

    /**
     * @param value the value to set
     */
    public void setValue(final String value) {
        this.value = value;
    }

我可以編輯一行,但是當我檢查自己的版本時,出現以下錯誤:

javax.faces.component.UpdateModelException: javax.el.PropertyNotWritableException: /envDisplay.xhtml @89,100 value="#{param.name}": java.lang.UnsupportedOperationException
    at javax.faces.component.UIInput.updateModel(UIInput.java:868) ~[jsf-api-2.2.18.jar:2.2]
    at javax.faces.component.UIInput.processUpdates(UIInput.java:751) ~[jsf-api-2.2.18.jar:2.2]
    at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1291) ~[jsf-api-2.2.18.jar:2.2]
    at org.primefaces.component.celleditor.CellEditor.processUpdates(CellEditor.java:101) ~[primefaces-6.2.jar:6.2]
    at org.primefaces.component.api.UIData.process(UIData.java:394) ~[primefaces-6.2.jar:6.2]
    at org.primefaces.component.api.UIData.processChildren(UIData.java:375) ~[primefaces-6.2.jar:6.2]
    at org.primefaces.component.api.UIData.processPhase(UIData.java:337) ~[primefaces-6.2.jar:6.2]
    at org.primefaces.component.api.UIData.processUpdates(UIData.java:323) ~[primefaces-6.2.jar:6.2]
    at org.primefaces.component.datatable.DataTable.processUpdates(DataTable.java:897) ~[primefaces-6.2.jar:6.2]
    at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:578) ~[jsf-impl-2.2.18.jar:2.2.18]
    at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183) ~[jsf-impl-2.2.18.jar:2.2.18]
    at org.primefaces.component.api.UIData.visitTree(UIData.java:850) ~[primefaces-6.2.jar:6.2]
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700) ~[jsf-api-2.2.18.jar:2.2]
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700) ~[jsf-api-2.2.18.jar:2.2]
    at javax.faces.component.UIForm.visitTree(UIForm.java:362) ~[jsf-api-2.2.18.jar:2.2]
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700) ~[jsf-api-2.2.18.jar:2.2]
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700) ~[jsf-api-2.2.18.jar:2.2]
    at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:404) ~[jsf-impl-2.2.18.jar:2.2.18]
    at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:267) ~[jsf-impl-2.2.18.jar:2.2.18]
    at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:57) ~[primefaces-6.2.jar:6.2]
    at javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1252) ~[jsf-api-2.2.18.jar:2.2]
    at com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78) ~[jsf-impl-2.2.18.jar:2.2.18]
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.2.18.jar:2.2.18]
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) [jsf-impl-2.2.18.jar:2.2.18]
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658) [jsf-api-2.2.18.jar:2.2]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [catalina.jar:9.0.17]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.17]
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:81) [primefaces-6.2.jar:6.2]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.17]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.17]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-websocket.jar:9.0.17]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.17]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.17]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:74) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) [spring-security-web-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357) [spring-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270) [spring-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.17]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.17]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) [spring-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.17]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.17]
    at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) [log4j-web-2.11.2.jar:2.11.2]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.17]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.17]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200) [catalina.jar:9.0.17]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [catalina.jar:9.0.17]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [catalina.jar:9.0.17]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [catalina.jar:9.0.17]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [catalina.jar:9.0.17]
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678) [catalina.jar:9.0.17]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [catalina.jar:9.0.17]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [catalina.jar:9.0.17]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-coyote.jar:9.0.17]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-coyote.jar:9.0.17]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) [tomcat-coyote.jar:9.0.17]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415) [tomcat-coyote.jar:9.0.17]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:9.0.17]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_131]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_131]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:9.0.17]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]
Caused by: javax.el.PropertyNotWritableException: /envDisplay.xhtml @89,100 value="#{param.name}": java.lang.UnsupportedOperationException
    at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:136) ~[jsf-impl-2.2.18.jar:2.2.18]
    at javax.faces.component.UIInput.updateModel(UIInput.java:834) ~[jsf-api-2.2.18.jar:2.2]
    ... 88 more
Caused by: javax.el.PropertyNotWritableException: java.lang.UnsupportedOperationException
    at javax.el.MapELResolver.setValue(MapELResolver.java:86) ~[el-api.jar:3.0.FR]
    at com.sun.faces.el.DemuxCompositeELResolver._setValue(DemuxCompositeELResolver.java:255) ~[jsf-impl-2.2.18.jar:2.2.18]
    at com.sun.faces.el.DemuxCompositeELResolver.setValue(DemuxCompositeELResolver.java:281) ~[jsf-impl-2.2.18.jar:2.2.18]
    at org.apache.el.parser.AstValue.setValue(AstValue.java:202) ~[jasper-el.jar:9.0.17]
    at org.apache.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:263) ~[jasper-el.jar:9.0.17]
    at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:131) ~[jsf-impl-2.2.18.jar:2.2.18]
    at javax.faces.component.UIInput.updateModel(UIInput.java:834) ~[jsf-api-2.2.18.jar:2.2]
    ... 88 more
Caused by: java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableMap.put(Collections.java:1457) ~[?:1.8.0_131]
    at javax.el.MapELResolver.setValue(MapELResolver.java:84) ~[el-api.jar:3.0.FR]
    at com.sun.faces.el.DemuxCompositeELResolver._setValue(DemuxCompositeELResolver.java:255) ~[jsf-impl-2.2.18.jar:2.2.18]
    at com.sun.faces.el.DemuxCompositeELResolver.setValue(DemuxCompositeELResolver.java:281) ~[jsf-impl-2.2.18.jar:2.2.18]
    at org.apache.el.parser.AstValue.setValue(AstValue.java:202) ~[jasper-el.jar:9.0.17]
    at org.apache.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:263) ~[jasper-el.jar:9.0.17]
    at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:131) ~[jsf-impl-2.2.18.jar:2.2.18]
    at javax.faces.component.UIInput.updateModel(UIInput.java:834) ~[jsf-api-2.2.18.jar:2.2]
    ... 88 more

#{param.value}錯誤相同)

問題出在var屬性中:

<p:dataTable value="#{bean.contextParams}" var="param">

#{param}是預定義的EL變量名稱之一,它與#{request}#{session}#{header}#{cookie}等一起,也稱為“ 隱式對象 ”。 #{param.foo}基本上會打印request.getParameter("foo") ,它基本上是不可變的。 您不能在請求參數映射中設置新值。 因此,例外。

您需要給它一個不保留的其他名稱。 例子:

  • <p:dataTable value="#{bean.contextParams}" var="contextParam">
  • <p:dataTable value="#{bean.contextParams}" var="parameter">
  • <p:dataTable value="#{bean.contextParams}" var="p">

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM