2012-03-20 49 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

相关问题