Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
丰富:日历和;班级';java.lang.String';没有财产……”;错误_Java_Jsf 2_Richfaces - Fatal编程技术网

丰富:日历和;班级';java.lang.String';没有财产……”;错误

丰富:日历和;班级';java.lang.String';没有财产……”;错误,java,jsf-2,richfaces,Java,Jsf 2,Richfaces,我有以下情况: 接口 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()

我有以下情况:

接口

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();}
实现类:

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;
}}
型号:

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;
}
<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>
>[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
jsf:

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

有人能帮我说一下我遗漏了什么吗?

异常和stacktrace告诉我,
{listModel.creationDate}
实际上是表单提交请求的更新模型值阶段的一个
字符串

例如,如果视图中的某个对象事先使用
字符串作为参数调用了
listMode.setCreationDate()
,就会发生这种情况。例如,通过类的
转换器
,或任何其他返回
字符串而不是所需对象类型的方法


在setter方法上放置一个断点,并在堆栈中跟踪根本原因。或者,您也可以将
对象
类型替换为
范围
类型或其他更具体的类型,这样JSF可能会抛出/显示一个转换异常/错误,这通常更能自我解释。

异常和堆栈跟踪告诉您
{listModel.creationDate}
实际上是表单提交请求的更新模型值阶段中的
字符串

例如,如果视图中的某个对象事先使用
字符串作为参数调用了
listMode.setCreationDate()
,就会发生这种情况。例如,通过类的
转换器
,或任何其他返回
字符串而不是所需对象类型的方法

在setter方法上放置一个断点,并在堆栈中跟踪根本原因。或者,您也可以将
对象
类型替换为
范围
类型或更具体的类型,这样JSF可能会抛出/显示一个转换异常/错误,这通常更能自我解释。

我发现了以下线程:

这表明JSF可能正在使用setter(接受
对象
)将值设置为字符串

你为什么讨厌打字安全

你应该让你的字段类型化-
updateDataRange
CreationDataRange
或者至少是
Range
(为什么你有两个类来实现
Range
?这不就是两个不同字段中相同类型的两个实例吗?

我发现了这个线程:

这表明JSF可能正在使用setter(接受
对象
)将值设置为字符串

你为什么讨厌打字安全


你应该让你的字段类型化-
updateDataRange
CreationDataRange
或者至少是
Range
(为什么你有两个类来实现
Range
?这不就是两个不同字段中相同类型的两个实例吗?

如前所述,你应该在你的模型字段中引入类型(最显著的是updateDate和creationDate)

JSF通过将任何字符串值转换为每个字段中指定的正确类型来更新模型。假设您有一个复杂的对象,那么JSF将把它存储在会话缓存中(或者序列化它,具体取决于您的faces config.xml),并将其另存为表单中的隐藏属性


当您随后提交表单时,它将尝试将此值转换回正确的类型。由于此字段的类型为Object,因此它可以保留原始字符串表示形式,并立即设置此字段而不进行转换。如果您将类型限制为Range,它将尝试转换该对象,并且将以c失败如果这不起作用,请更正错误消息。

如前所述,您应该在模型字段中引入类型(尤其是updateDate和creationDate)

JSF通过将任何字符串值转换为每个字段中指定的正确类型来更新模型。假设您有一个复杂的对象,那么JSF将把它存储在会话缓存中(或者序列化它,具体取决于您的faces config.xml),并将其另存为表单中的隐藏属性


当您随后提交表单时,它将尝试将此值转换回正确的类型。由于此字段的类型为Object,因此它可以保留原始字符串表示形式,并立即设置此字段而不进行转换。如果您将类型限制为Range,它将尝试转换该对象,并且将以c失败如果这不起作用,请更正错误消息。

我也遇到了同样的问题。我通过像这样为dataTable添加惰性atribute找到了解决方案

 <p:dataTable lazy="true" var="itemOrder" value="#{orderBean.orderList}">


但是我不明白为什么。

我也面临着同样的问题。我通过像这样为dataTable添加惰性atribute找到了一个解决方案

 <p:dataTable lazy="true" var="itemOrder" value="#{orderBean.orderList}">


但是我不明白为什么。

JSF/EL没有理由对嵌套属性调用setter。它只为“端点”调用setter因此,视图中一定有其他东西触发了setter调用,并向其传递了错误的值。我同意——并对您的答案投了赞成票——我的观点是,他允许将此字段设置为任何值,同时对字段包含的内容进行假设。JSF/EL不会对嵌套属性调用setter没有理由地调用。它只为“端点”调用它因此,视图中一定有其他东西触发了setter调用并向其传递了错误的值。我同意——并对您的答案投了赞成票——我的观点是,他允许将此字段设置为任何值,同时对字段包含的内容进行假设。JSF/EL不会隐式地这样做。它只会在OP的情况下,当显式引用视图中的嵌套属性时,如
value=“#{listModel.creationDate}”
。JSF将仅在其视图或会话范围内的情况下将父托管bean存储在“会话缓存”(如您所说)中。JSF/EL不会隐式地这样做。