我從JSF(Mojarra 2.2和Glassfish 4)開始,目前正在與一個web應用程序一起練習,這個應用程序的任務是在數據庫中存儲客戶端和訂單。檢索selectOneMenu複雜對象作爲選定項
創建新訂單時,其中一個功能是允許從JSF <h:selectOneMenu>
中選擇現有客戶端。訂單實體保存其他屬性中的客戶端實體...
我已經按照BalusC的偉大回答有關從DB(here)預填充一個<h:selectOneMenu>
,並已成功地填充礦從存儲在一個渴望ApplicationScoped ManagedBean數據,但我無法設法將支持bean中的選定項目作爲複雜對象進行檢索。它始終爲空。
這讓我氣瘋了,你的幫助將被真正的讚賞! 下面是相關的代碼片段:
@ManagedBean(eager = true)
@ApplicationScoped
public class Data implements Serializable {
private static final long serialVersionUID = 1L;
@EJB
private ClientDao clientDao;
private List<Client> clients;
@PostConstruct
private void init() {
clients = clientDao.lister();
}
public List<Client> getClients() {
return clients;
}
}
創建訂單豆(注: 'COMMANDE' 是指爲了;)
@ManagedBean
@RequestScoped
public class CreerCommandeBean implements Serializable {
private static final long serialVersionUID = 1L;
private Commande commande;
private String choixNouveauClient = "nouveauClient";
@EJB
private CommandeDao commandeDao;
public CreerCommandeBean() {
commande = new Commande();
}
public void inscrire() {
System.out.println("client : " + commande.getClient()); // prints **NULL**
// ... orderService to store in DB
}
... getters and setters
客戶端轉換器:
@FacesConverter(value = "clientConverter", forClass = Client.class)
public class ClientConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value == null) {
return null;
}
Data data = context.getApplication().evaluateExpressionGet(context, "#{data}", Data.class);
for (Client c : data.getClients()) {
if (c.getId().toString().equals(value)) {
return c;
}
}
throw new ConverterException(new FacesMessage(String.format("Cannot convert %s to Client", value)));
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return (value instanceof Client) ? String.valueOf(((Client) value).getId()) : null;
}
}
的facelet摘錄:
<p:outputPanel id="gridContainerAncienClient">
<p:selectOneMenu value="#{creerCommandeBean.commande.client}"
rendered="#{creerCommandeBean.choixNouveauClient == 'ancienClient'}">
<f:converter converterId="clientConverter" />
<f:selectItems value="#{data.clients}" var="cli"
itemValue="#{cli}" itemLabel="#{cli.prenom} #{cli.nom}" />
</p:selectOneMenu>
</p:outputPanel>
非常感謝萊斯特!現在一切正常。並感謝與BalusC的帖子一樣,鏈接是非凡的;-) – Zim
不客氣! :) – Lester