[SEAM] 用f:SelectItems 中出現java.util.NoSuchElementException

Mrpublic 2009-06-04
<h:selectOneMenu  value="#{bean.datevalue}" id="show"
           <f:selectItem itemLabel=" ...請選擇..." />
           <f:selectItems value="#{bean.date}" />
           <a4j:support event="onchange" reRender="showList"></a4j:support>
       </h:selectOneMenu>


bean這個類中,
我定義了一個
private String datevalue;

//getter and setter 方法
.....


//
public List<SelectItem> getDate(){

List<SelectItem> selectItem=new LinkedList<SelectItem>();
Set<Date> tempSet=new HashSet<Date>();

tempSet= manager.returnDate();

Iterator<Date> iterator=tempSet.iterator();
while(iterator.hasNext()){
Date  date=iterator.next();
String label=changeDate(date);
SelectItem item=new SelectItem(label,label);
selectItem.add(item);
}
return selectItem;
}
Mrpublic 2009-06-04
tempSet= manager.returnDate();
是返回一個 HashSet對象;


在頁面上能在下拉菜單中出現我要的顯示結果,但選中下拉菜單上某個選項 觸發onchange 時就出下面的錯
===========================================

Caused by: java.util.NoSuchElementException
at javax.faces.component.SelectItemsIterator.next(SelectItemsIterator.java:117)
at javax.faces.component.SelectItemsIterator.next(SelectItemsIterator.java:144)
at javax.faces.component.SelectItemsIterator.next(SelectItemsIterator.java:49)
at javax.faces.component.UISelectOne.matchValue(UISelectOne.java:164)
at javax.faces.component.UISelectOne.validateValue(UISelectOne.java:137)
at javax.faces.component.UIInput.validate(UIInput.java:867)
at javax.faces.component.UIInput.executeValidate(UIInput.java:1065)
at javax.faces.component.UIInput.processDecodes(UIInput.java:636)
at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1001)
at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1001)
at javax.faces.component.UIForm.processDecodes(UIForm.java:203)
at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1001)
at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1001)
at org.ajax4jsf.component.AjaxViewRoot$1.invokeContextCallback(AjaxViewRoot.java:392)
at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:238)
at org.ajax4jsf.component.AjaxViewRoot.processDecodes(AjaxViewRoot.java:409)
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:101)
... 44 more
Mrpublic 2009-06-04
這是怎么一回事呢? 難道不能用Set???
但改為List還是一樣的錯!!!


開始我返回的
Iterator<Date> iterator=tempSet.iterator();
while(iterator.hasNext()){
Date  date=iterator.next();
String label=changeDate(date);
SelectItem item=new SelectItem(label,label);
selectItem.add(item);



Iterator<Date> iterator=tempSet.iterator();
while(iterator.hasNext()){
Date  date=iterator.next();
String label=changeDate(date);
SelectItem item=new SelectItem(date,label);
selectItem.add(item);



頁面上的:
<h:selectOneMenu  value="#{bean.datetype}" id="show"
           <f:selectItem itemLabel=" ...請選擇..." />
           <f:selectItems value="#{bean.date}" />
           <a4j:support event="onchange" reRender="showList"></a4j:support>
       </h:selectOneMenu>

datetype 是我在bean中定義的一個Date類型
它報這樣的錯:

不能把Date convert to null?????
Mrpublic 2009-06-04
汗個 是會話問題:
取到的下拉列表的值為null

加上 @Scope(ScopeType.CONVERSATION)就OK了
Mrpublic 2009-06-04
我看了一下提示文檔
SelectItem item=new SelectItem(Object value,String label);

可為什麽我用
SelectItem item=new SelectItem(date,label); //date 為Date類型,label為 String

會出錯

而用
SelectItem item=new SelectItem(value, label); // value label都是String型

就OK呢?

難道 只能為兩個String類型的參數??
无双Rama 2009-07-09
Mrpublic 写道
汗個 是會話問題:
取到的下拉列表的值為null

加上 @Scope(ScopeType.CONVERSATION)就OK了


请问你这个会话是在哪里加的?
为什么我在后台action类中加了范围,但还在会报相同的错误呢?
5day 2009-07-09
<h:selectOneMenu />
用<s:selectItems>是最方便的,不过总会出些莫名其妙的问题。
例如:
<h:selectOneMenu id="acate" value="#{mlvsTvisit.aimcategory}">
<s:selectItems value="#{mlvsTAimCategorys}"
								var="mlvsTVisitAimCategory"
								label="#{mlvsTVisitAimCategory.viewname}"
								noSelectionLabel="请选择... ..." />
<s:convertEntity />
</h:selectOneMenu>


用<f:selectItems />最稳当。

new SelectItem(Object value,String label);
当然是可以用其他对象的,加<s:convertEntity />,不过要是entity。
<h:selectOneMenu value="#{cmScategoryinportal.category}">
<f:selectItems value="#{cmScategoryingroups}" />
<s:convertEntity />
</h:selectOneMenu>

日期类的选择为什么不用:
<rich:calendar/>呢:例如:
<rich:calendar value="#{mlvsTvisitalllist.mlvsTvisitallliststartdate}"
					datePattern="yyyy-MM-dd" />


而java.util.NoSuchElementException错误很多是session的问题,我喜欢用@Factory方法来取得selectitems的value,提前将Factory方法需要用到的对象放到Page或者Session context中。这样就不大会出问题了。
Mrpublic 2009-07-09
5day 写道
<h:selectOneMenu />
用<s:selectItems>是最方便的,不过总会出些莫名其妙的问题。
例如:
<h:selectOneMenu id="acate" value="#{mlvsTvisit.aimcategory}">
<s:selectItems value="#{mlvsTAimCategorys}"
								var="mlvsTVisitAimCategory"
								label="#{mlvsTVisitAimCategory.viewname}"
								noSelectionLabel="请选择... ..." />
<s:convertEntity />
</h:selectOneMenu>


用<f:selectItems />最稳当。

new SelectItem(Object value,String label);
当然是可以用其他对象的,加<s:convertEntity />,不过要是entity。
<h:selectOneMenu value="#{cmScategoryinportal.category}">
<f:selectItems value="#{cmScategoryingroups}" />
<s:convertEntity />
</h:selectOneMenu>

日期类的选择为什么不用:
<rich:calendar/>呢:例如:
<rich:calendar value="#{mlvsTvisitalllist.mlvsTvisitallliststartdate}"
					datePattern="yyyy-MM-dd" />


而java.util.NoSuchElementException错误很多是session的问题,我喜欢用@Factory方法来取得selectitems的value,提前将Factory方法需要用到的对象放到Page或者Session context中。这样就不大会出问题了。



謝謝 5day哦
<s:convertEntity />  是啥子意思哦 沒有遇到過哦 沒有見過,有啥作用
Mrpublic 2009-07-09
因為我是選中某一個日期便會觸發一個事件
5day 2009-07-09
<s:convertEntity />就是将对象转成seam可以识别的entity。
Global site tag (gtag.js) - Google Analytics