1 year ago

#339260

test-img

Daniel Maldonado

JSF selectOneMenu converter null or class cast exception

  • JVM Version: 14.0.2+12-46
  • myfaces-api 2.3.9
  • myfaces-impl 2.3.9
  • apache-tomee-webprofile-8.0.4

I am using the following converter for an simple entity class:

package view;

import entities.Chain;
import managed.Chains;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.inject.Inject;
import javax.inject.Named;

@Named
@FacesConverter(value = "chainConverter", managed = true)
public class ChainConverter implements Converter<Chain> {
   @Inject
   Chains chains;   

   @Override
   public Chain getAsObject(FacesContext context, UIComponent component, String value) {
        if (value != null && !value.trim().isEmpty()) {
            Chain found = chains.getAvailable().stream()
                      .filter(chain -> chain.getAbbreviation().equals(value))
                      .findFirst()
                      .orElse(null);
            return found;
        }
      return null;
      
   }

   @Override
   public String getAsString(FacesContext context, UIComponent component, Chain chain) {
      if (chain != null && !chain.toString().isEmpty()){
         return chain.getAbbreviation();
         
      }else{
         return null;
         
      }
      
   }

}

Given the example at: https://www.primefaces.org/showcase/ui/input/oneMenu.xhtml

I try to use the converter as follows:

<p:selectOneMenu id="chain" value="#{chains.chain}" var="c" converter="chainConverter">
   <f:selectItem itemLabel="== Selecte Chain ==" />
   <f:selectItems value="#{chains.available}" var="chain" itemLabel="#{chain.name}" itemValue="#{chain}" />
      <p:column>
        #{c.name}
      </p:column>
      <p:ajax event="valueChange" listener="#{inventories.refreshSurvey}" update="@form" />
</p:selectOneMenu>

The above "converter=" reference produces the following error:

org.primefaces.application.exceptionhandler.PrimeExceptionHandler.logException null
    java.lang.NullPointerException
        at org.apache.myfaces.cdi.converter.FacesConverterCDIWrapper.getAsString(FacesConverterCDIWrapper.java:69)
        at org.primefaces.renderkit.SelectRenderer.getOptionAsString(SelectRenderer.java:207)
        at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeOption(SelectOneMenuRenderer.java:561)
        at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeSelectItems(SelectOneMenuRenderer.java:524)
        at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeHiddenSelect(SelectOneMenuRenderer.java:211)

If I change the converter reference to an el expression as follows:

 converter="#{chainConverter}"

I get the error:

org.primefaces.application.exceptionhandler.PrimeExceptionHandler.logException Cannot convert [entities.Chain@928f] of type [class java.lang.String] to [class entities.Chain]
    javax.el.ELException: Cannot convert [entities.Chain@928f] of type [class java.lang.String] to [class entities.Chain]
        at org.apache.el.lang.ELSupport.coerceToType(ELSupport.java:548)
        at org.apache.el.parser.AstValue.setValue(AstValue.java:203)
        at org.apache.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:263)
        at org.apache.webbeans.el22.WrappedValueExpression.setValue(WrappedValueExpression.java:93)
        at org.apache.webbeans.el22.WrappedValueExpression.setValue(WrappedValueExpression.java:93)

However, the weirdest thing is that in one project it works while in the other project it does not. For example in this sample project it works as expected: https://github.com/dannymk/PrimefacesTest

I have a nagging suspicion that there is a difference in a library version someplace in this project. However, I really can't pinpoint the problem even after changing the pom file to match a working projects pom file. This is definitely a head scratcher to me.

java

jsf

primefaces

el

converters

0 Answers

Your Answer

Accepted video resources