Tengo algunas JSF-problemas con el uso de h:selectOneMenu con una lista de mis backend bean:
Mi xhtml archivo se parece a esto:

  <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>

donde la correspondiente gestión de frijol se parece a esto:

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;
}

El problema se produce en la entrega del formulario en mi navegador, el pleno de la pila de errores se parece a esto:

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
  • setPdfPresets(String presetName) no es una buena idea, sólo tienes que tener los setters y getters de coherente tipos; también a pesar de lo que su comentario sugiere que no la sobrecarga.
  • Por medio de un setter para la Cadena era sólo una prueba, tratando de escribir la cadena devuelta en una propiedad separada. Desgraciadamente esto no funciona.
  • Coloca el ratón encima de la [selectonemenu] etiqueta que se pone en la pregunta a ti mismo y haga clic en información en el link de popbox.
InformationsquelleAutor Rob | 2012-03-20

2 Comentarios

  1. 3

    Intente esto:

      <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>

    donde la correspondiente gestión de frijol se parece a esto:

    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;
    }
    • Maldita sea, estás en lo correcto. Me perdí el error de un par de horas. Mi setter/getter para PdfPreset ya existía, yo soy, simplemente, dejar ‘em out, ya que pensé que el error se encuentra en la lista.
    • No olvide pulsar el «Esta contestado a mi pregunta»botón..
  2. 3

    Su valor de atributo debe ser un String en lugar de un List<String> ya que contendrá la selección. Y tu bean no es realmente un bean, ya que las necesidades únicas de incubadoras para los campos con el fin de ser procesados por JSF.

    Así que usted debe cambiar su frijol código de una manera que tiene un List<String> con getters y setters y un String para la selección con separado getters y setters:

    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;
    }

    Y en la vista:

    <h:selectOneMenu id="preset" value="#{overview.selectedPdfPreset}" >
    <f:selectItems value="#{overview.pdfPresets}" />
    </h:selectOneMenu>
    • No estoy realmente seguro de qué hacer. Puede usted darme algún código?
    • Muchas gracias, parece que me he estado perdiendo algunas grave error en el original de mi h:selectOneMenu.

Dejar respuesta

Please enter your comment!
Please enter your name here