2012-03-20 59 views
1

我有一些JSF麻煩,使用h:selectOneMenu和後端列表豆: 我的XHTML文件看起來是這樣的:JSF h:selectOneMenu麻煩:java.lang.IllegalArgumentException無法將類java.lang.String的「字符串」轉換爲接口java.util.List

<f:view> 
    <h:form id="serverOptions"> 
     <h:selectOneMenu id="preset" value="#{overview.pdfPresets}" > 
     <f:selectItems value="#{overview.pdfPresets}" /> 
     </h:selectOneMenu> 
     <h:commandButton action="submit" value="Submit" /> 
    </h:form> 
    </f:view> 

,其中相應的管理豆看起來是這樣的:

private List<String> pdfPresets; 
private String pdfPreset; 

/** 
* Returns a list of pdfPresets 
* @return a List<String> of pdf preset names 
*/ 
public final List<String> getPdfPresets() { 
    return pdfPresets; 
} 

/** 
* Sets the name of the selected pdfPreset 
* (trying to overload setPdfPresets here) 
* @param presetName 
* @see setPdfPreset 
*/ 
public final void setPdfPresets(String presetName) { 
    // write preset name somehwere else 
    this.presetName = presetName; 
} 

/** 
* Sets the pdfPresets 
* @param list 
*/ 
public final void setPdfPresets(List<String> list) { 
    pdfPresets = list; 
} 

在我的瀏覽器提交表單出現的問題,完整的錯誤堆棧看起來像這個:

EVERE: An exception occurred 
javax.faces.component.UpdateModelException: java.lang.IllegalArgumentException: Cannot convert screen_druckbogen of type class java.lang.String to interface java.util.List 
    at javax.faces.component.UIInput.updateModel(UIInput.java:398) 
    at javax.faces.component.UIInput.processUpdates(UIInput.java:299) 
    at javax.faces.component.UIForm.processUpdates(UIForm.java:187) 
    at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1258) 
    at javax.faces.component.UIViewRoot._processUpdatesDefault(UIViewRoot.java:1317) 
    at javax.faces.component.UIViewRoot.access$600(UIViewRoot.java:75) 
    at javax.faces.component.UIViewRoot$UpdateModelPhaseProcessor.process(UIViewRoot.java:1419) 
    at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1278) 
    at javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:761) 
    at org.apache.myfaces.lifecycle.UpdateModelValuesExecutor.execute(UpdateModelValuesExecutor.java:34) 
    at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171) 
    at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:440) 
    at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) 
    at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:943) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 
Caused by: java.lang.IllegalArgumentException: Cannot convert screen_druckbogen of type class java.lang.String to interface java.util.List 
    at com.sun.el.lang.ELSupport.coerceToType(ELSupport.java:397) 
    at com.sun.el.parser.AstValue.setValue(AstValue.java:164) 
    at com.sun.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:273) 
    at org.apache.myfaces.view.facelets.el.TagValueExpression.setValue(TagValueExpression.java:117) 
    at javax.faces.component.UIInput.updateModel(UIInput.java:380) 
    ... 29 more 
+0

'setPdfPresets(字符串presetName)'是不是一個好主意,你應該只制定者和一致類型的干將;儘管你的評論表明這不是超載。 – Viruzzo 2012-03-20 12:43:44

+0

對String使用額外的setter只是一個測試,試圖將返回的字符串寫入一個單獨的屬性。不幸的是,它沒有奏效。 – Rob 2012-03-20 12:49:11

+1

將鼠標置於你自己提出問題的'[selectonemenu]'標記之上,然後單擊popbox上的* info *鏈接。 – BalusC 2012-03-20 13:09:51

回答

3

試試這個:

<f:view> 
    <h:form id="serverOptions"> 
     <h:selectOneMenu id="preset" value="#{overview.pdfPreset}" > <!-- typo here --> 
     <f:selectItems value="#{overview.pdfPresets}" /> 
     </h:selectOneMenu> 
     <h:commandButton action="submit" value="Submit" /> 
    </h:form> 
    </f:view> 

其中相應的管理豆看起來是這樣的:

private List<String> pdfPresets; 
private String pdfPreset; 

/** 
* Returns a list of pdfPresets 
* @return a List<String> of pdf preset names 
*/ 
public final List<String> getPdfPresets() { 
    return pdfPresets; 
} 

/** 
* Sets the name of the selected pdfPreset 
* (trying to overload setPdfPresets here) 
* @param presetName 
* @see setPdfPreset 
*/ 
public final void setPdfPreset(String presetName) { //renamed method 
    // write preset name somehwere else 
    pdfPreset = presetName; //use the correct variable 
} 

/** 
* Sets the pdfPresets 
* @param list 
*/ 
public final void setPdfPresets(List<String> list) { 
    pdfPresets = list; 
} 
+0

該死的,你說得對。我錯過了幾個小時的錯字。我的PdfPreset的setter/getter已經存在,我只是讓我們出去,因爲我認爲列表中的錯誤。 – Rob 2012-03-20 12:54:11

+1

不要忘記按「這回答我的問題」 - 按鈕.. – barsju 2012-03-20 12:58:00

3

您的價值屬性需要爲String而不是List<String>,因爲它將包含所選內容。而且你的bean並不是一個真正的bean,因爲它需要字段的唯一設置器才能被JSF處理。

所以,你應該改變你的bean的代碼的方式,它有一個List<String>的getter和setter與獨立 getter和setter選擇一個String

private List<String> pdfPresets; 
private String selectedPdfPreset; 

public List<String> getPdfPresets() { 
    return pdfPresets; 
} 

public void setPdfPresets(List<String> pdfPresets) { 
    this.pdfPresets = pdfPresets; 
} 

public String getSelectedPdfPreset() { 
    return selectedPdfPreset; 
} 

public void setSelectedPdfPreset(String selectedPdfPreset) { 
    this.selectedPdfPreset = selectedPdfPreset; 
} 

並在視圖:

<h:selectOneMenu id="preset" value="#{overview.selectedPdfPreset}" > 
     <f:selectItems value="#{overview.pdfPresets}" /> 
</h:selectOneMenu> 
+0

我不太確定,該怎麼做。你能給我提供一些代碼嗎? – Rob 2012-03-20 12:50:13

+0

非常感謝,看起來我在原來的h中錯過了一些嚴重的錯字:selectOneMenu。 – Rob 2012-03-20 12:55:36

相關問題