JSF h: selectOneMenu Неполадка: java.lang.IllegalArgumentException Невозможно преобразовать «строку» класса типа java.lang.String в интерфейс java.util.List - PullRequest
1 голос
/ 20 марта 2012

У меня есть некоторые JSF-проблемы с использованием h: selectOneMenu со списком из моего внутреннего компонента: мой xhtml-файл выглядит так:

  <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

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Попробуйте это:

  <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;
}
3 голосов
/ 20 марта 2012

Ваш атрибут значения должен быть String вместо List<String>, потому что он будет содержать выбор.И ваш бин на самом деле не является бином, так как ему требуются уникальные установщики полей для обработки JSF.

Так что вы должны изменить свой код бина таким образом, чтобы он имел List<String> с геттерами исеттеры и 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>
...