title: ClassCastException when two controllers used in a single JSF
body: <p>I am developing a JSF application with JPA using Netbeans. I crate Entity classes and then generate JSF pages from Entity classes through Netbeans. It creates an AbstractFacade,  facade extending the abstract facade for each entity, controller bean for each entity and a JSF page. Then I alter and use these generated codes to create my logic.</p>
  
  <p>There is <em>intermittently a</em> <strong>ClassCastException when I use two controller beans within a single JSF page</strong>. But when I restart the GLassFish server, the exception disappers for some time and appear again and I can not find out what initiated the change.
  For example, consider a situation where there is an Entity called Atm.It has a property MedicineGroup, which is also another entity. When an object from Atm entity is going to be saved through a JSF page, I get all the MedicineGroups calling the MedicineGroupController and assigning it to a selected GenericName property of Atm object. This logic works well until that ClassCastException occur.</p>
  
  <p>(The same above method is used in most JSF pages. Atm entity has a property of Vtm. Ampp has peoperties like Atm atm, MeasurmentUnit strengthUnit, Double strength, Double rol, etc.)</p>
  
  <p>I can also get the same thing done by changing the logic so that there will be only one controller for each JSF page, but it is very easy if multiple controller beans can be referred within the same JSF page.</p>
  
  <p>What is wrong here?</p>
  
  <hr>
  
  <p>I have listed some important code below.</p>
  
  <p>The relevant part of JSF page.</p>
  
  <pre><code>&lt;h:selectOneListbox id="txtGroup" value="#{vtmController.current.medicineGroup}" size="5" &gt;
      &lt;f:selectItems value="#{medicineGroupController.items}" var="gp" itemValue="#{gp}" itemLabel="#{gp.name}"/&gt;
  &lt;/h:selectOneListbox&gt;
  </code></pre>
  
  <hr>
  
  <p>Example of an Entity class</p>
  
  <pre><code>@Entity
  @Inheritance
  public class Vtm extends PharmaceuticalItem implements Serializable {
  
  @ManyToOne
  MedicineGroup medicineGroup;
  
  public MedicineGroup getMedicineGroup() {
      return medicineGroup;
  }
  
  public void setMedicineGroup(MedicineGroup medicineGroup) {
      this.medicineGroup = medicineGroup;
  }
  
  
  
  }
  </code></pre>
  
  <hr>
  
  <p>The controller class example which include an auto-generated converter.</p>
  
  <pre><code>@ManagedBean
  @SessionScoped
  public final class VtmController {
  
  @EJB
  private VtmFacade ejbFacade;
  SessionController sessionController = new SessionController();
  List&lt;Vtm&gt; lstItems;
  private Vtm current;
  private DataModel&lt;Vtm&gt; items = null;
  private int selectedItemIndex;
  boolean selectControlDisable = false;
  boolean modifyControlDisable = true;
  String selectText = "";
  
  public VtmController() {
  }
  
  public List&lt;Vtm&gt; getLstItems() {
      return getFacade().findBySQL("Select d From Vtm d");
  }
  
  public void setLstItems(List&lt;Vtm&gt; lstItems) {
      this.lstItems = lstItems;
  }
  
  public int getSelectedItemIndex() {
      return selectedItemIndex;
  }
  
  public void setSelectedItemIndex(int selectedItemIndex) {
      this.selectedItemIndex = selectedItemIndex;
  }
  
  public Vtm getCurrent() {
      if (current == null) {
          current = new Vtm();
      }
      return current;
  }
  
  public void setCurrent(Vtm current) {
      this.current = current;
  }
  
  private VtmFacade getFacade() {
      return ejbFacade;
  }
  
  public DataModel&lt;Vtm&gt; getItems() {
      items = new ListDataModel(getFacade().findAll("name", true));
      return items;
  }
  
  public static int intValue(long value) {
      int valueInt = (int) value;
      if (valueInt != value) {
          throw new IllegalArgumentException(
                  "The long value " + value + " is not within range of the int type");
      }
      return valueInt;
  }
  
  public DataModel searchItems() {
      recreateModel();
      if (items == null) {
          if (selectText.equals("")) {
              items = new ListDataModel(getFacade().findAll("name", true));
          } else {
              items = new ListDataModel(getFacade().findAll("name", "%" + selectText + "%",
                      true));
              if (items.getRowCount() &gt; 0) {
                  items.setRowIndex(0);
                  current = (Vtm) items.getRowData();
                  Long temLong = current.getId();
                  selectedItemIndex = intValue(temLong);
              } else {
                  current = null;
                  selectedItemIndex = -1;
              }
          }
      }
      return items;
  
  }
  
  public Vtm searchItem(String itemName, boolean createNewIfNotPresent) {
      Vtm searchedItem = null;
      items = new ListDataModel(getFacade().findAll("name", itemName, true));
      if (items.getRowCount() &gt; 0) {
          items.setRowIndex(0);
          searchedItem = (Vtm) items.getRowData();
      } else if (createNewIfNotPresent) {
          searchedItem = new Vtm();
          searchedItem.setName(itemName);
          searchedItem.setCreatedAt(Calendar.getInstance().getTime());
          searchedItem.setCreater(sessionController.loggedUser);
          getFacade().create(searchedItem);
      }
      return searchedItem;
  }
  
  private void recreateModel() {
      items = null;
  }
  
  public void prepareSelect() {
      this.prepareModifyControlDisable();
  }
  
  public void prepareEdit() {
      if (current != null) {
          selectedItemIndex = intValue(current.getId());
          this.prepareSelectControlDisable();
      } else {
          JsfUtil.addErrorMessage(new MessageProvider().getValue("nothingToEdit"));
      }
  }
  
  public void prepareAdd() {
      selectedItemIndex = -1;
      current = new Vtm();
      this.prepareSelectControlDisable();
  }
  
  public void saveSelected() {
      if (selectedItemIndex &gt; 0) {
          getFacade().edit(current);
          JsfUtil.addSuccessMessage(new MessageProvider().getValue("savedOldSuccessfully"));
      } else {
          current.setCreatedAt(Calendar.getInstance().getTime());
          current.setCreater(sessionController.loggedUser);
          getFacade().create(current);
          JsfUtil.addSuccessMessage(new MessageProvider().getValue("savedNewSuccessfully"));
      }
      this.prepareSelect();
      recreateModel();
      getItems();
      selectText = "";
      selectedItemIndex = intValue(current.getId());
  }
  
  public void addDirectly() {
      JsfUtil.addSuccessMessage("1");
      try {
  
          current.setCreatedAt(Calendar.getInstance().getTime());
          current.setCreater(sessionController.loggedUser);
  
          getFacade().create(current);
          JsfUtil.addSuccessMessage(new MessageProvider().getValue("savedNewSuccessfully"));
          current = new Vtm();
      } catch (Exception e) {
          JsfUtil.addErrorMessage(e, "Error");
      }
  
  }
  
  public void cancelSelect() {
      this.prepareSelect();
  }
  
  public void delete() {
      if (current != null) {
          current.setRetired(true);
          current.setRetiredAt(Calendar.getInstance().getTime());
          current.setRetirer(sessionController.loggedUser);
          getFacade().edit(current);
          JsfUtil.addSuccessMessage(new MessageProvider().getValue("deleteSuccessful"));
      } else {
          JsfUtil.addErrorMessage(new MessageProvider().getValue("nothingToDelete"));
      }
      recreateModel();
      getItems();
      selectText = "";
      selectedItemIndex = -1;
      current = null;
      this.prepareSelect();
  }
  
  public boolean isModifyControlDisable() {
      return modifyControlDisable;
  }
  
  public void setModifyControlDisable(boolean modifyControlDisable) {
      this.modifyControlDisable = modifyControlDisable;
  }
  
  public boolean isSelectControlDisable() {
      return selectControlDisable;
  }
  
  public void setSelectControlDisable(boolean selectControlDisable) {
      this.selectControlDisable = selectControlDisable;
  }
  
  public String getSelectText() {
      return selectText;
  }
  
  public void setSelectText(String selectText) {
      this.selectText = selectText;
      searchItems();
  }
  
  public void prepareSelectControlDisable() {
      selectControlDisable = true;
      modifyControlDisable = false;
  }
  
  public void prepareModifyControlDisable() {
      selectControlDisable = false;
      modifyControlDisable = true;
  }
  
  @FacesConverter(forClass = Vtm.class)
  public static class VtmControllerConverter implements Converter {
  
      public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
          if (value == null || value.length() == 0) {
              return null;
          }
          VtmController controller = (VtmController) facesContext.getApplication().getELResolver().
                  getValue(facesContext.getELContext(), null, "vtmController");
          return controller.ejbFacade.find(getKey(value));
      }
  
      java.lang.Long getKey(String value) {
          java.lang.Long key;
          key = Long.valueOf(value);
          return key;
      }
  
      String getStringKey(java.lang.Long value) {
          StringBuffer sb = new StringBuffer();
          sb.append(value);
          return sb.toString();
      }
  
      public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
          if (object == null) {
              return null;
          }
          if (object instanceof Vtm) {
              Vtm o = (Vtm) object;
              return getStringKey(o.getId());
          } else {
              throw new IllegalArgumentException("object " + object + " is of type "
                      + object.getClass().getName() + "; expected type: " + VtmController.class.getName());
          }
      }
  }
  }
  </code></pre>
  
  <hr>
  
  <p>An Example for a Facade</p>
  
  <pre><code>@Stateless
  public class VtmFacade extends AbstractFacade&lt;Vtm&gt; {
  @PersistenceContext(unitName = "HOPU")
  private EntityManager em;
  
  @Override
  protected EntityManager getEntityManager() {
      return em;
  }
  
  public VtmFacade() {
      super(Vtm.class);
  }
  
  
  }
  </code></pre>
  
  <hr>
  
  <p>The generated abstract facade and the changes I made.</p>
  
  <pre><code>public abstract class AbstractFacade&lt;T&gt; {
  
  protected Class&lt;T&gt; entityClass;
  
  public AbstractFacade(Class&lt;T&gt; entityClass) {
      this.entityClass = entityClass;
  }
  
  protected abstract EntityManager getEntityManager();
  
  public void create(T entity) {
      getEntityManager().persist(entity);
  }
  
  public void edit(T entity) {
      getEntityManager().merge(entity);
  }
  
  public void remove(T entity) {
      getEntityManager().remove(getEntityManager().merge(entity));
  }
  
  public T find(Object id) {
      return getEntityManager().find(entityClass, id);
  }
  
  public List&lt;T&gt; findAll(boolean withoutRetired) {
      return findAll(null, null, withoutRetired);
  }
  
  public List&lt;T&gt; findAll() {
      javax.persistence.criteria.CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
      javax.persistence.criteria.CriteriaQuery&lt;T&gt; cq = cb.createQuery(entityClass);
      javax.persistence.criteria.Root&lt;T&gt; rt = cq.from(entityClass);
      return getEntityManager().createQuery(cq).getResultList();
  }
  
  public List&lt;T&gt; findAll(String fieldName) {
      return findAll(fieldName, "", false);
  }
  
  public List&lt;T&gt; findAll(String fieldName, boolean withoutRetired) {
      return findAll(fieldName, "", withoutRetired);
  }
  
  public List&lt;T&gt; findAll(String fieldName, String fieldValue) {
      return findAll(fieldName, fieldValue, false);
  }
  
  public List&lt;T&gt; findBySQL(String temSQL) {
      TypedQuery&lt;T&gt; qry = getEntityManager().createQuery(temSQL, entityClass);
      return qry.getResultList();
  }
  
  
  public List&lt;T&gt; findBySQL(String temSQL, Map&lt;String, Date&gt; parameters) {
      TypedQuery&lt;T&gt; qry = getEntityManager().createQuery(temSQL, entityClass);
      Set s=parameters.entrySet();
      Iterator it=s.iterator();
      while (it.hasNext()){
          Map.Entry m=(Map.Entry)it.next();
          Date pVal =  (Date) m.getValue();
          String pPara=(String) m.getKey();
          qry.setParameter(pPara, pVal, TemporalType.DATE);
          System.out.println("Parameter " + pPara + "\tVal" + pVal);
      }
      return qry.getResultList();
  }    
  
  private void test(Class myClass, Object ob) {
  }
  
  public List&lt;T&gt; findAll(String fieldName, String fieldValue, boolean withoutRetired) {
      javax.persistence.criteria.CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
      javax.persistence.criteria.CriteriaQuery&lt;T&gt; cq = cb.createQuery(entityClass);
      javax.persistence.criteria.Root&lt;T&gt; rt = cq.from(entityClass);
      ParameterExpression&lt;String&gt; p = cb.parameter(String.class);
      Predicate predicateField = cb.like(rt.&lt;String&gt;get(fieldName), fieldValue);
      Predicate predicateRetired = cb.equal(rt.&lt;Boolean&gt;get("retired"), false);
      Predicate predicateFieldRetired = cb.and(predicateField, predicateRetired);
  
      if (withoutRetired &amp;&amp; !fieldValue.equals("")) {
          cq.where(predicateFieldRetired);
      } else if (withoutRetired) {
          cq.where(predicateRetired);
      } else if (!fieldValue.equals("")) {
          cq.where(predicateField);
      }
  
      if (!fieldName.equals("")) {
          cq.orderBy(cb.asc(rt.get(fieldName)));
      }
  
      return getEntityManager().createQuery(cq).getResultList();
  }
  
  public List&lt;T&gt; findExact(String fieldName, String fieldValue, boolean withoutRetired) {
      javax.persistence.criteria.CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
      javax.persistence.criteria.CriteriaQuery&lt;T&gt; cq = cb.createQuery(entityClass);
      javax.persistence.criteria.Root&lt;T&gt; rt = cq.from(entityClass);
      ParameterExpression&lt;String&gt; p = cb.parameter(String.class);
      Predicate predicateField = cb.equal(cb.upper(rt.&lt;String&gt;get(fieldName)), fieldValue.toLowerCase());
      Predicate predicateRetired = cb.equal(rt.&lt;Boolean&gt;get("retired"), false);
      Predicate predicateFieldRetired = cb.and(predicateField, predicateRetired);
  
      if (withoutRetired &amp;&amp; !fieldValue.equals("")) {
          cq.where(predicateFieldRetired);
      } else if (withoutRetired) {
          cq.where(predicateRetired);
      } else if (!fieldValue.equals("")) {
          cq.where(predicateField);
      }
  
      if (!fieldName.equals("")) {
          cq.orderBy(cb.asc(rt.get(fieldName)));
      }
  
      return getEntityManager().createQuery(cq).getResultList();
  }
  
  public T findByField(String fieldName, String fieldValue, boolean withoutRetired) {
      List&lt;T&gt; lstAll = findExact(fieldName, fieldValue, true);
      if (lstAll.isEmpty()) {
          return null;
      } else {
          return lstAll.get(0);
      }
  }
  
  public T findFirstBySQL(String temSQL) {
      TypedQuery&lt;T&gt; qry = getEntityManager().createQuery(temSQL, entityClass);
      try {
          return qry.getResultList().get(0);
      } catch (Exception e) {
          System.out.println(e.getMessage());
          return null;
      }
  }
  
  public &lt;U&gt; List&lt;T&gt; testMethod(U[] a, Collection&lt;U&gt; all) {
      List&lt;T&gt; myList = new ArrayList&lt;T&gt;();
      return myList;
  }
  
  public &lt;U&gt; List&lt;T&gt; findAll(String fieldName, int searchID, boolean withoutRetired) {
  
      javax.persistence.criteria.CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
      javax.persistence.criteria.CriteriaQuery&lt;T&gt; cq = cb.createQuery(entityClass);
      javax.persistence.criteria.Root&lt;T&gt; rt = cq.from(entityClass);
  
      if (withoutRetired) {
          cq.where(cb.and(cb.equal(rt.get("retired"), false)),
                  (cb.equal(rt.get(fieldName).get("id"), searchID)));
      } else {
          cq.where(cb.equal(rt.get("retired"), false));
      }
  
      return getEntityManager().createQuery(cq).getResultList();
  }
  
  public int count() {
      javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
      javax.persistence.criteria.Root&lt;T&gt; rt = cq.from(entityClass);
      cq.select(getEntityManager().getCriteriaBuilder().count(rt));
      javax.persistence.Query q = getEntityManager().createQuery(cq);
      return ((Long) q.getSingleResult()).intValue();
  }
  
  
  public Double findAggregateDbl(String strJQL){
      Query q= getEntityManager().createQuery(strJQL);
      try{
          return (Double) q.getSingleResult();
      }catch (Exception e){
          System.out.println(e.getMessage());
          return 0.0;
      }
  }
  
  
  }
  </code></pre>
  
  <hr>
  
  <p>This is the code which is referred by the exception.</p>
  
  <pre><code>            AtmController controller = (AtmController) facesContext.getApplication().getELResolver().
                  getValue(facesContext.getELContext(), null, "atmController");
  </code></pre>
  
  <p>In different instances, this same corresponding place, but a different controller. When error occur once, despite the JSF page access afterwords, the same Controller is giving the error, but after server restart, the controller differs depending on the page where error started to occur.</p>
  
  <p>This is the full stack trace. (The name of the controller classes changes depending on the JSF page I use to access.)</p>
  
  <pre><code>INFO: java.lang.ClassCastException: gov.sp.health.bean.VtmController cannot be cast to gov.sp.health.bean.AtmController
  java.lang.ClassCastException: gov.sp.health.bean.VtmController cannot be cast to gov.sp.health.bean.AtmController
      at gov.sp.health.bean.AtmController$VtmControllerConverter.getAsObject(AtmController.java:252)
      at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:171)
      at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectOneValue(MenuRenderer.java:202)
      at com.sun.faces.renderkit.html_basic.MenuRenderer.getConvertedValue(MenuRenderer.java:319)
      at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1030)
      at javax.faces.component.UIInput.validate(UIInput.java:960)
      at javax.faces.component.UIInput.executeValidate(UIInput.java:1233)
      at javax.faces.component.UIInput.processValidators(UIInput.java:698)
      at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:508)
      at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1590)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)
      at javax.faces.component.UIForm.visitTree(UIForm.java:344)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1601)
      at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:376)
      at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:252)
      at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183)
      at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1170)
      at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
      at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
      at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
      at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
      at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
      at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
      at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
      at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
      at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
      at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
      at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849)
      at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746)
      at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045)
      at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228)
      at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
      at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
      at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
      at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
      at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
      at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
      at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
      at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
      at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
      at java.lang.Thread.run(Thread.java:722)
  </code></pre>
  
  <hr>
  
  <p>Converter inside AtmController</p>
  
  <pre><code>@FacesConverter(forClass = Atm.class)
  public static class AtmControllerConverter implements Converter {
  
      public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
          if (value == null || value.length() == 0) {
              return null;
          }
          AtmController controller = (AtmController) facesContext.getApplication().getELResolver().
                  getValue(facesContext.getELContext(), null, "atmController");
          return controller.ejbFacade.find(getKey(value));
      }
  
      java.lang.Long getKey(String value) {
          java.lang.Long key;
          key = Long.valueOf(value);
          return key;
      }
  
      String getStringKey(java.lang.Long value) {
          StringBuffer sb = new StringBuffer();
          sb.append(value);
          return sb.toString();
      }
  
      public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
          if (object == null) {
              return null;
          }
          if (object instanceof Atm) {
              Atm o = (Atm) object;
              return getStringKey(o.getId());
          } else {
              throw new IllegalArgumentException("object " + object + " is of type "
                      + object.getClass().getName() + "; expected type: " + AtmController.class.getName());
          }
      }
  }
  </code></pre>
  
  <hr>
  
  <p>Converter inside the VtmController</p>
  
  <pre><code>@FacesConverter(forClass = Vtm.class)
  public static class VtmControllerConverter implements Converter {
  
      public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
          if (value == null || value.length() == 0) {
              return null;
          }
          VtmController controller = (VtmController) facesContext.getApplication().getELResolver().
                  getValue(facesContext.getELContext(), null, "vtmController");
          return controller.ejbFacade.find(getKey(value));
      }
  
      java.lang.Long getKey(String value) {
          java.lang.Long key;
          key = Long.valueOf(value);
          return key;
      }
  
      String getStringKey(java.lang.Long value) {
          StringBuffer sb = new StringBuffer();
          sb.append(value);
          return sb.toString();
      }
  
      public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
          if (object == null) {
              return null;
          }
          if (object instanceof Vtm) {
              Vtm o = (Vtm) object;
              return getStringKey(o.getId());
          } else {
              throw new IllegalArgumentException("object " + object + " is of type "
                      + object.getClass().getName() + "; expected type: " + VtmController.class.getName());
          }
      }
  }
  </code></pre>
  
  <hr>
  
  <p>Converter inside the MedicineGroupController</p>
  
  <pre><code>@FacesConverter(forClass = MedicineGroup.class)
  public static class MedicineGroupControllerConverter implements Converter {
  
      public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
          if (value == null || value.length() == 0) {
              return null;
          }
          MedicineGroupController controller = (MedicineGroupController) facesContext.getApplication().getELResolver().
                  getValue(facesContext.getELContext(), null, "medicineGroupController");
          return controller.ejbFacade.find(getKey(value));
      }
  
      java.lang.Long getKey(String value) {
          java.lang.Long key;
          key = Long.valueOf(value);
          return key;
      }
  
      String getStringKey(java.lang.Long value) {
          StringBuffer sb = new StringBuffer();
          sb.append(value);
          return sb.toString();
      }
  
      public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
          if (object == null) {
              return null;
          }
          if (object instanceof MedicineGroup) {
              MedicineGroup o = (MedicineGroup) object;
              return getStringKey(o.getId());
          } else {
              throw new IllegalArgumentException("object " + object + " is of type "
                      + object.getClass().getName() + "; expected type: " + MedicineGroupController.class.getName());
          }
      }
  }
  </code></pre>