tutouser
tutouser

Reputation: 11

PrimeFaces AutoComplete - Converter Error Rendering View[/index.xhtml] java.lang.ClassCastException: Text cannot be cast to java.lang.String

When I run this code it gives me the following exception:

com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException SCHWERWIEGEND: Error Rendering View[/index.xhtml] java.lang.ClassCastException: Text cannot be cast to java.lang.String.

I am using Primefaces 5.0 and JSF 2.2

index.xhtml

<body>
    <h:form>
        <h:panelGrid columns="2" cellpadding="5">
            <p:outputLabel value="Simple:" for="acSimple" />
            <p:autoComplete id="acSimple" value="#{autoCompleteView.txt}"
                completeMethod="#{autoCompleteView.completeText}" var="t" itemValue="#{t}"
                itemLabel="#{t.query}" converter="#{TextConverter}">
                <f:facet name="itemtip">
                    <h:panelGrid columns="2" cellpadding="5">
                        <span>Hello</span>
                        <h:outputText value="#{t.query}" />
                        <h:outputText value="#{t.id}" />
                    </h:panelGrid>
                </f:facet>
            </p:autoComplete>
        </h:panelGrid>
    </h:form>
</body>

Text.java

public class Text {

  private String id;

  private String query;

  public String getId() {
    return this.id;
  }

  public Text(final String id, final String query) {

    this.id = id;
    this.query = query;
  }

  public Text() {

    this.id = "";
    this.query = "";
  }

  public String setId(final String id) {
    return this.id = id;
  }

  public String getQuery() {
    return this.query;
  }

  public String setQuery(final String query) {
    return this.query = query;
  }

  @Override
  public String toString() {
    return this.query;
  }

}

TextConverter.java

@FacesConverter("TextConverter")
public class TextConverter implements Converter {

  @ManagedProperty(value = "#{autoCompleteView}")
  private AutoCompleteView A;

  @Override
  public Object getAsObject(final FacesContext context, final UIComponent component, final String value) {
    for (final Text t : this.A.getResults()) {
      if (t.getId().equals(value)) {
        return t;
      }
    }
    return null;
  }

  @Override
  public String getAsString(final FacesContext context, final UIComponent component, final Object value) {
    // TODO Auto-generated method stub
    if (value instanceof Text) {
      final Text t = (Text) value;
      return t.toString();
    }
    return "";

  }

}

AutoCompleteView.java

@ManagedBean
@SessionScoped
public class AutoCompleteView {

  private String txt;

  private List<Text> Texts;

  private Text t = null;

  private List<Text> results;

  public List<Text> getTexts() {
    return this.Texts;
  }

  public void setTexts(final List<Text> texts) {
    this.Texts = texts;
  }

  public List<Text> completeText(final String txt) {
    this.results = new ArrayList<>();
    for (int i = 0; i < 10; i++) {

      final String id = "" + i;
      final String s = txt + i;
      this.t = new Text(id, s);
      System.out.println(this.t);
      this.results.add(this.t);
    }

    return this.results;
  }

  public String getTxt() {
    return this.txt;
  }

  public void setTxt1(final String txt) {
    this.txt = txt;
  }

  public List<Text> getResults() {
    return this.results;
  }

  public void setResults(final List<Text> results) {
    this.results = results;
  }

}

Error

com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
SCHWERWIEGEND: Error Rendering View[/index.xhtml]
java.lang.ClassCastException: Text cannot be cast to java.lang.String
    at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeSuggestionsAsList(AutoCompleteRenderer.java:497)
    at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeSuggestions(AutoCompleteRenderer.java:393)
    at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeResults(AutoCompleteRenderer.java:123)
    at org.primefaces.component.autocomplete.AutoCompleteRenderer.encodeEnd(AutoCompleteRenderer.java:105)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:924)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
    at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:559)
    at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1689)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at javax.faces.component.UIForm.visitTree(UIForm.java:371)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
    at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:399)
    at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:319)
    at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:60)
    at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:1004)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:417)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Jul 28, 2015 5:13:50 PM org.apache.catalina.core.StandardWrapperValve invoke
SCHWERWIEGEND: Servlet.service() for servlet [Faces Servlet] in context with path [/AutocompleteObject] threw exception
java.lang.IllegalStateException: CDATA tags may not nest
    at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.startCDATA(HtmlResponseWriter.java:681)
    at javax.faces.context.ResponseWriterWrapper.startCDATA(ResponseWriterWrapper.java:179)
    at javax.faces.context.PartialResponseWriter.startError(PartialResponseWriter.java:341)
    at org.primefaces.context.PrimePartialResponseWriter.startError(PrimePartialResponseWriter.java:174)
    at com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError(AjaxExceptionHandlerImpl.java:200)
    at com.sun.faces.context.AjaxExceptionHandlerImpl.handle(AjaxExceptionHandlerImpl.java:124)
    at javax.faces.context.ExceptionHandlerWrapper.handle(ExceptionHandlerWrapper.java:100)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Upvotes: 1

Views: 2182

Answers (1)

My-Name-Is
My-Name-Is

Reputation: 4940

Your converter is bound to an EL expression. Change the part with the converter to: converter="TextConverter" and it will work.

NOTE: If your Converter isn't annotated with @FacesConverter, then you have to use the EL-expression: converter="#{textConverter}" in your facelet!

If you run into troubles by using any PrimeFaces component you should always refer to the PrimeFaces-ShowCase. Most of the time the mistake is trivial.

Upvotes: 2

Related Questions