2011-01-08 12 views
5

itemValue nesnesinde etiket var mı?Nesne olarak maddeValue in <f: selectItems>

public class Foo { 
    private int id; 
    private String name; 
    private Date date; 
} 

Ve Bean Şimdi

public class Bar { 
    private Foo foos; 
} 

public class BarBean { 
    private Set<Foo> foos; 
} 

BarBean ben güncel Bar Foo almak için olması gerekir adlı başka sınıf Bar:

mesela bana sınıf Foo var böyle Kullanıcı: düzenlenen

<h:selectOneMenu value="#{barBean.bar.foo}" required="true"> 
<f:selectItems value="#{barBean.foos}" var="foo" itemLabel="#{foo.name}" itemValue="#{foo}" /> 
</h:selectOneMenu> 

---------------:

my converter: 

package ir.khorasancustoms.g2g.converters; 

import ir.khorasancustoms.g2g.persistance.CatalogValue; 
import java.util.ResourceBundle; 
import javax.faces.application.FacesMessage; 
import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.convert.Converter; 
import javax.faces.convert.FacesConverter; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.hibernate.cfg.Configuration; 

@FacesConverter("ir.khorasancustoms.CatalogValueConverter") 
public class CatalogValueConverter implements Converter { 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
    SessionFactory factory = new Configuration().configure().buildSessionFactory(); 
    Session session = factory.openSession(); 

    try { 
     int id = Integer.parseInt(value); 
     CatalogValue catalogValue = (CatalogValue) session.load(CatalogValue .class, id); 
     return catalogValue; 
    } catch (Exception ex) { 
     Transaction tx = session.getTransaction(); 
     if (tx.isActive()) { 
     tx.rollback(); 
     } 
     ResourceBundle rb = ResourceBundle.getBundle("application"); 
     String message = rb.getString("databaseConnectionFailed"); 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, message, message)); 
    } finally { 
     session.close(); 
    } 

    return null; 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
    return ((CatalogValue) value).getId() + ""; 
    } 

} 

ve benim facelet:

<h:outputText value="#{lbls.paymentUnit}:"/> 
    <h:selectOneMenu id="paymentUnit" label="#{lbls.paymentUnit}" value="#{price.price.ctvUnit}" required="true"> 
     <f:selectItems value="#{price.paymentUnits}"/> 
     <f:converter converterId="ir.khorasancustoms.CatalogValueConverter"/> 
    </h:selectOneMenu> 
    <h:message for="paymentUnit" infoClass="info" errorClass="error" warnClass="warning" fatalClass="fatal"/> 
+0

OmniFaces önce

@FacesConverter(forClass = Foo.class) 

uygular kullanılıyorsa Dunno özel bir dönüştürücü .. Daha fazla bilgi [burada] (http: //showcase-omnifaces.rhcloud.com/vitrin/dönüştürücüler/SelectItemsConverter.xhtml) –

cevap

4

Evet bu mümkün.

Sen Jigar iki mükemmel çözümler sunar tarafından başvurulan olarak SelectItem

Check implementation and very good article here

+3

İşaret ettiğiniz makale üzerinde durulur, ancak kendi özetiniz tam olarak doğru değildir. Dönüştürücü '' SelectItem''üne dönüşmez, ancak model nesnesini (Foo here) bir String göstergesine dönüştürür ve geri dönüştürür. Bu String gösterimi için model nesnesinin anahtarı veya kimliği alınır ve bu kimliği bir DAO'nun kullanıldığı bir nesneye geri dönüştürülür. –

+1

Öğreticiye göre bir dönüştürücü oluşturdum ama fasulye değerini ayarlamada başarısız oluyor, sorumu güncelledim, lütfen koduma bir göz atın. – ehsun7b

2

BalusC makalesine Foo dönüştürecek bir dönüştürücü yazmak gerekir. Bu, bir DAO kullanan ya da destek fasulyesinde ileri geri dönüştürülen Dizeler kullanan bir dönüştürücü aracılığıyla.

Ek bir çözüm bu ikisinin bir melezidir. Ör. Bir f:param, dönüştürücüye, sözü edilen BalusC destek kabındaki Haritaya işaret eden bir EL değeri ifadesine erişim verebilirsiniz. Her dönüşüm için DB'ye erişmesi gerekebilecek DAO yerine, Harita'ya danışılır.

Bu, tüm Foo nesnesini <f:selectItems> etiketinde kullanmanıza olanak tanır ve her postadan sonra DB'ye olası çağrıyı kaydeder. Bununla birlikte, dönüştürücüyü, parametreyi ve haritayı sağlamanız gerektiğinden, maliyet, kodlamada bazı ekstra karmaşıklıktır.

(ı. Arka fasulye görünümü kapsamı veya daha büyük bir kapsamda olduğu zaman böyle bir Harita iyi çalıştığını Btw eklemek zorunda DB çağrıları üzerine o istek kapsamında geldiğinde Gerçekten kurtaracak olmaz)

+0

Görüyorum ama Converters ile ilk dokunuşta benim için biraz karmaşık, sadece yaptığım düşünüyorum Object ve ID arasında bir dönüşüme ihtiyacım var, ama Doğrulama hatası içinde biter! :( – ehsun7b

+0

@Ehsun: Hangi doğrulama hatası? "Değer geçerli değil"? Eğer öyleyse, [bu yanıtı kontrol edin] (http://stackoverflow.com/questions/3039338/jsf-validation-error-shown-by-hmessage-while -update-model-why/3039886 # 3039886) – BalusC

+0

Eşit yöntemini geçersiz kılmadım, prob'u çözdüm. – ehsun7b

1

Ben MyFaces 2.0.2 çıkıyorum ve itemLabel foo için varsayılan bu,

<h:selectOneMenu value="#{barBean.bar.foo}" required="true"> 
<f:selectItems value="#{barBean.foos}" var="foo" itemLabel="#{foo.name}" itemValue="#{foo}" /> 
</h:selectOneMenu> 

veya daha iyi

<h:selectOneMenu value="#{barBean.bar.foo}" required="true"> 
<f:selectItems value="#{barBean.foos}" /> 
</h:selectOneMenu> 

çalışır çalışır. toString() - bir kümesi

gerekli <f:converter> isnt önemli olan ancak foos bir List<Foo> değilse itemValue kullanılarak kompleks nesneleri kullanmak bir çözüm FooConverter