Need Help h:selectOneMenu
nagendra_singh_krishnawat Aug 11, 2009 5:10 AMI 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.."/> </h:selectOneMenu>
Here allCustodians
is variable from seam context as follows:
@SuppressWarnings("unchecked") @Factory(value="allCustodians",scope=ScopeType.APPLICATION) 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; @Name("custodianAccountHome") @Scope(ScopeType.CONVERSATION) public class CustodianAccountHome extends EntityHome<CustodianAccount> { @In EntityManager entityManager; Person lendingAgent,accountingContact, tradeContact,cca ; private String spPortfolioType, isPortfolioType; public void setCustodianAccountId(Integer id) { setId(id); } public Integer getCustodianAccountId() { return (Integer) getId(); } @Override 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 */ @Factory(value="allPortfolioTypeContext",scope=ScopeType.APPLICATION) 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:
@Entity @Audited @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 */ @Id @SequenceGenerator(name = "CustodianAccount", sequenceName = "custodian_account_id") @GeneratedValue(generator = "CustodianAccount") private int id; @ManyToOne(optional=false) @ForeignKey(name = "FK_CA_bank") private Bank bank; @ManyToOne @ForeignKey(name = "FK_CA_bankbranch") private BankBranch branch; @OneToOne 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:convertEntity/> <s:selectItems value="#{allCustodians}" var="bankVar" label="#{bankVar.name}" noSelectionLabel="Please Select.."/> </h:selectOneMenu>
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.