Я использую jsf 2.2.18 и Primefaces 6.2, и пытаюсь реализовать простое редактируемое p:datatable
, в соответствии с этой демонстрацией простых лиц: https://www.primefaces.org/showcase/ui/data/datatable/edit.xhtml
Проблема в том, что я не могу проверитьмои модификации строки.
Ничего не находя в интернете, кроме некоторых проблем с геттерами / сеттерами (не вызывающих точно такую же ошибку), я просто попытался изменить средства доступа, если они являются зарезервированными словами, заменив #{param.name}
на#{param.pname}
и #{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-компонент 'environment':
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);
}
}
И мой bean-компонент 'param':
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}
)