1 Reply Latest reply on Jan 18, 2012 12:48 AM by william stephen

    Need Help h:selectOneMenu

    Nagendra krishnawat Newbie

      I have a dropdown list on UI:

      CustodianAccountCreate.xhtml code:

      <h:selectOneMenu value="#{custodianAccountHome.instance.bank}" style="width:110px" required="true" >
                              <s:selectItems value="#{allCustodians}" var="bankVar"  label="#{bankVar.name}" noSelectionLabel="Please Select.."/>

      Here allCustodians is variable from seam context as follows:

          public List<Bank> getAllCustodians(){
              Query q = getEntityManager().createQuery("select bank from Bank bank");
              List<Bank> list = q.getResultList();
              return list;

      import java.util.ArrayList;
      import java.util.List;
      import javax.persistence.EntityManager;
      import org.jboss.seam.ScopeType;
      import org.jboss.seam.annotations.Factory;
      import org.jboss.seam.annotations.In;
      import org.jboss.seam.annotations.Name;
      import org.jboss.seam.annotations.Scope;
      import org.jboss.seam.framework.EntityHome;
      import com.xyz.party.Bank;
      import com.xyz.party.BankBranch;
      import com.xyz.party.Person;
      import com.xyz.portfolio.CustodianAccount;
      import com.xyz.portfolio.PortfolioType;
      public class CustodianAccountHome extends EntityHome<CustodianAccount> {
              @In     EntityManager entityManager;
              Person lendingAgent,accountingContact, tradeContact,cca ;
              private String spPortfolioType, isPortfolioType;
              public void setCustodianAccountId(Integer id) {
          public Integer getCustodianAccountId() {
              return (Integer) getId();
          public CustodianAccount getInstance() {
              return super.getInstance();
              public Person getLendingAgent() {
                      return lendingAgent;
              public void setLendingAgent(Person lendingAgent) {
                      this.lendingAgent = lendingAgent;
              public Person getAccountingContact() {
                      return accountingContact;
              public void setAccountingContact(Person accountingContact) {
                      this.accountingContact = accountingContact;
           * Creates a list of entities which are to be displayed on "Search Preferences".
           * @return List
          public List<String[]> getPortfolioTypeList() {
              List<String[]> selectItems;
              List<PortfolioType> portfolioTypeList=  getEntityManager().createQuery("select portfolioType from PortfolioType portfolioType").getResultList();
              selectItems = new ArrayList<String[]>();
              selectItems.add(new String[]{"","Please Select"});
              for(int index=0;index<portfolioTypeList.size();index++){
                  PortfolioType portfolioType = portfolioTypeList.get(index);
                  selectItems.add(new String[]{portfolioType.getCode(),portfolioType.getName()});
              return selectItems;
              public Person getTradeContact() {
                      return tradeContact;
              public void setTradeContact(Person tradeContact) {
                      this.tradeContact = tradeContact;
              public Person getCca() {
                      return cca;
              public void setCca(Person cca) {
                      this.cca = cca;
              public String getSpPortfolioType() {
                      return spPortfolioType;
              public void setSpPortfolioType(String spPortfolioType) {
                      this.spPortfolioType = spPortfolioType;
              public String getIsPortfolioType() {
                      return isPortfolioType;
              public void setIsPortfolioType(String isPortfolioType) {
                      this.isPortfolioType = isPortfolioType;

      Entity Classes are CustodianAccount and Bank, One Bank can have many CustodianAccount as follows:

      @NamedQueries( {
          @NamedQuery(name = "CustodianAccount.findByBankName", query = "select c from CustodianAccount c where c.bank.name=:name"),
          @NamedQuery(name = "CustodianAccount.findByAccountName", query = "select c from CustodianAccount c where c.name=:name"),
          @NamedQuery(name = "CustodianAccount.findByPFNumber", query = "select c from CustodianAccount c where c.portfolio.portfolioNumber=:portfolioNumber")
      @Table(uniqueConstraints = @UniqueConstraint(columnNames = {"portfolio", "bank", "primaryAccountNumber"}))
      public class CustodianAccount extends AbstractServiceAccount {
          /** Primary key id */
          @SequenceGenerator(name = "CustodianAccount", sequenceName = "custodian_account_id")
          @GeneratedValue(generator = "CustodianAccount")
          private int id;
          @ForeignKey(name = "FK_CA_bank")
          private Bank bank;
          @ForeignKey(name = "FK_CA_bankbranch")
          private BankBranch branch;
          private ClientPortfolio portfolio;

      My aim is to create a new CustodianAccount using UI. On the UI user selects one Bank out of list of banks (h:selectOneMenu) and press save.

      I get following exception on click of save:

      /portfolio/CustodianAccountCreate.xhtml @24,121 value="#{custodianAccountHome.instance.bank}": java.lang.IllegalArgumentException: argument type mismatch 

      If I add s:convertEntity I get "value not valid"

      <h:selectOneMenu value="#{custodianAccountHome.instance.bank}" style="width:110px" required="true" >
                              <s:selectItems value="#{allCustodians}" var="bankVar"  label="#{bankVar.name}" noSelectionLabel="Please Select.."/>

      I was able to do this functionnality by creating a int vatiable in CustodianAccountHome class and then getting the entity using entityManmager and saving it but this approach Doesn't seem to be very clean.

      Awaiting advice on this.