2012-03-20 20 views
1

バックエンドのリストでh:selectOneMenuを使用してJSF問題が発生しました豆: 私のXHTMLファイルは次のようになります。JSF h:selectOneMenu trouble:java.lang.IllegalArgumentException java.lang.Stringクラスの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; 
} 

、完全なエラー・スタックがどのように見えますthis:

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

+0

追加のsetterをStringに使用するのは、返された文字列を別のプロパティに書き込もうとするテストだけでした。不運にも、それはうまくいかなかった。 – Rob

+1

自分で質問に載せた '[selectonemenu]'タグの上にマウスを置き、ポップアップで* info * linkをクリックしてください。 – BalusC

答えて

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> 
対応する管理Beanは次のようになります

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のための私のセッター/ゲッタはすでに存在していました。 – Rob

+1

「これは私の質問に答えました」ボタンを押すことを忘れないでください。 – barsju

3

値の属性はの代わりにStringである必要があります。これは選択を保持するためです。また、Beanは実際にはBeanではありません。なぜなら、BeanはJSFによって処理されるためにフィールドの固有のセッターを必要とするからです。

だから、あなたはそれが別々ゲッターとセッターとゲッターとセッターとList<String>と選択のためのString持っているような方法であなたのBeanコードを変更する必要があります。

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

+0

多くのおかげで、私は元のh:selectOneMenuにいくつかの深刻なタイプミスを見逃していたようです。 – Rob

関連する問題