I have the following situation:
Interface
public interface Ranged{
public Object getRangeStart();
public Object getRangeEnd();
public void setRangeStart(Object rangeStart);
public void setRangeEnd(Object rangeEnd);
public void setRange(boolean isRange);
public boolean getRange();}
implementing class:
public class CreationDateRange implements Ranged, Serializable{
private static final long serialVersionUID = SerialVersionUID.getSerialVersionUID();
public DateRange()
{
super();
}
private Date dateFrom;
private Date dateTo;
private boolean isRange = false;
public Object getRangeStart()
{
return (Date)dateFrom;
}
public Object getRangeEnd()
{
return (Date)dateTo;
}
public void setRangeStart( Object from )
{
this.dateFrom = (Date)from;
}
public void setRangeEnd( Object to )
{
this.dateTo = (Date)to;
}
public void setRange( boolean isRange )
{
this.isRange = isRange;
}
public boolean getRange()
{
return isRange;
}}
Model:
private Object updateDate = new DateRange();
private Object creationDate = new DateRange();
public void setUpdateDate( Object updateDate )
{
this.updateDate = updateDate;
}
public Object getUpdateDate()
{
return updateDate;
}
public void setCreationDate( Object creationDate )
{
this.creationDate = creationDate;
}
public Object getCreationDate()
{
return creationDate;
}
jsf:
<f:viewParam name="creationDate" value="#{doiListController.model.creationDate}"/>
<f:viewParam name="updateDate" value="#{doiListController.model.updateDate}"/>
...
<td style="font-size: 5pt; border: 0; min-width:60px">
<rich:calendar value="#{listModel.creationDate.rangeStart}"
datePattern="yyyy-MM-dd" enableManualInput="true"
rendered="#{listModel.creationDate.range}">
<f:convertDateTime pattern="yyyy-mm-dd" />
</rich:calendar>
</td>
Error:
>[exec] javax.faces.component.UpdateModelException: javax.el.PropertyNotFoundException: /view/doi/doiListView.xhtml @90,59 value="#{listModel.creationDate.rangeStart}": The cla
ss 'java.lang.String' does not have the property 'rangeStart'.
[exec] at javax.faces.component.UIInput.updateModel(UIInput.java:853)
[exec] at javax.faces.component.UIInput.processUpdates(UIInput.java:735)
[exec] at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242)
[exec] at javax.faces.component.UIForm.processUpdates(UIForm.java:281)
[exec] at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242)
[exec] at javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1231)
[exec] at com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78)
[exec] at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
[exec] at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
[exec] at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409)
[exec] at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534)
[exec] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
[exec] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
[exec] at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
[exec] at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
[exec] at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
[exec] at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
[exec] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
[exec] at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326)
[exec] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227)
[exec] at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170)
[exec] at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
[exec] at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
[exec] at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
[exec] at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
[exec] at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
[exec] at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
[exec] at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
[exec] at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
[exec] at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
[exec] at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
[exec] at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
[exec] at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
[exec] at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
[exec] at java.lang.Thread.run(Thread.java:619)
[exec] Caused by: javax.el.PropertyNotFoundException: /view/doi/doiListView.xhtml @90,59 value="#{listModel.creationDate.rangeStart}": The class 'java.lang.String' does not ha
ve the property 'rangeStart'.
[exec] at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:133)
[exec] at javax.faces.component.UIInput.updateModel(UIInput.java:818)
[exec] ... 34 more
Can someone help me and say me what am I missing, please?
The exception and stacktrace is telling that #{listModel.creationDate}
is actually a String
during the update model values phase of the form submit request.
That can for example happen if something in your view has called listMode.setCreationDate()
with a String
as argument beforehand. For example, by a <f:viewParam>
, <h:inputHidden>
, Converter
-for-class, or whatever else is returning a String
instead of the desired object type.
Put a breakpoint on the setter method and track the root cause down in the stack. Alternatively, you can also replace Object
type by Ranged
type or somehing more specific, so that JSF would possibly throw/display a conversion exception/error which is usually more self-explaining.