读书人

[JSF]求救SelectItems有关问题几天

发布时间: 2012-01-06 22:55:18 作者: rapoo

[JSF]求救,SelectItems问题,几天了都未解决!!
我在JSF中不论是用 <h:selectManyListbox> 还是 <h:selectOnuMenu> 都报这样的错误:
16:01:59,343 ERROR [jsp]:704 - Servlet.service() for servlet jsp threw exception
java.lang.IllegalArgumentException: "{2} " Conversion Error setting value ' '{0} ' ' for ' '{1} ' '.
at com.sun.faces.util.Util.getSelectItems(Util.java:610)
at com.sun.faces.renderkit.html_basic.MenuRenderer.getOptionNumber(MenuRenderer.java:488)
at com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:465)
at com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:430)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:712)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:443)
at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:233)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:693)
at javax.faces.webapp.UIComponentTag.encodeChildren(UIComponentTag.java:600)
at javax.faces.webapp.UIComponentTag.doEndTag(UIComponentTag.java:537)
at com.sun.faces.taglib.html_basic.PanelGridTag.doEndTag(PanelGridTag.java:460)
at org.apache.jsp.general.createGameTable_jsp._jspx_meth_h_panelGrid_0(createGameTable_jsp.java:319)
at org.apache.jsp.general.createGameTable_jsp._jspx_meth_h_form_0(createGameTable_jsp.java:222)
at org.apache.jsp.general.createGameTable_jsp._jspService(createGameTable_jsp.java:145)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:147)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)


at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)

我的JSP文件内容如下:

<h:outputLabel for= "homeTeamInput ">
<h:outputText value= "主场球队: " />
</h:outputLabel>
<h:selectManyListbox id= "homeTeamInput " required= "true " value= "#{gameBean.hometeamId} ">
<basketball:validateSelectedItemsRange minNum= "1 "/>
<f:selectItems value= "#{teamListBean.teamSelectItems} " id= "selectHomeTeams "/>
</h:selectManyListbox>
<h:message for= "homeTeamInput " styleClass= "errors " />

<h:outputLabel for= "guestTeamInput ">
<h:outputText value= "客场球队: " />
</h:outputLabel>
<h:selectManyListbox id= "guestTeamInput " required= "true " value= "#{gameBean.guestteamId} ">
<basketball:validateSelectedItemsRange minNum= "1 "/>
<f:selectItems value= "#{teamListBean.teamSelectItems} " id= "selectGuestTeams "/>
</h:selectManyListbox>
<h:message for= "guestTeamInput " styleClass= "errors " />



其中teamListBean是applicationScope,teamSelectItems是一个SelectItem[], gameBean.guestteamId是String型。

backing bean文件内容如下 :

1.TeamListBean.java

//SelectItem[] for the gameTable team selectItems
private SelectItem[] teamSelectItems;
public SelectItem[] getTeamSelectItems() {
if (this.teamSelectItems == null) {
try {
List teams = this.serviceLocator.getCacheService()
.getAllTeams();
HashMap teamMap = new HashMap();
this.teamSelectItems = new SelectItem[teams.size()];
for (int i = 0; i < teams.size(); i++) {
teamMap = (HashMap) teams.getLight Bulb;
String tName_Key = (String) teamMap.get( "teamname ");
String tId_Value = (String) teamMap.get( "teamId ");
teamSelectItems[i] = new SelectItem(tId_Value, tName_Key);
}
} catch (Exception e) {
String msg = "Could not getTeamSelectItems ";
this.logger.error( "Could not getTeamSelectItems ", e);
throw new FacesException(msg, e);
}
}
return this.teamSelectItems;
}

public void setTeamSelectItems(SelectItem[] newTeamSelectItem){
this.teamSelectItems = newTeamSelectItem;
}

2.GameBean.java

/** persistent field */
private String hometeamId;

/** persistent field */
private String guestteamId;

public String getGuestteamId() {
return this.guestteamId;
}

public void setGuestteamId(String guestTeamId){
this.logger.debug( "GameBean setGuestteamId()! ");
this.guestteamId = guestTeamId;
}

public String getHometeamId() {
return this.hometeamId;
}

public void setHometeamId(String homeTeamId){


this.logger.debug( "GameBean setHometeamId()! ");
this.hometeamId = homeTeamId;
}

在google上查了好久都没有,知道可能是type not match,但修改了都不行啊!求达人帮忙!!

[解决办法]
用 <h:selectManyListbox> 时,它的value必须是array或者是list,建议用string[],
<h:selectOneMenu> 的value必须是string,否则会有错误。
用 <h:selectOneMenu> 就可以了。
检查你的 <basketball:validateSelectedItemsRange minNum= "1 "/> ,可以先删掉试试,应该是没有问题的。祝你好运。

读书人网 >Java Web开发

热点推荐