2015-05-12 13 views
5

ile bir genel JSF nesne dönüştürücüsüne karşı argümanlar Görünümler ve model arasında varlıkları/dtos'ları eşleştirmek için SelectItems'in bir listesini oluşturmak için kazan plakası kodundan kaçınmak istiyorum, bu nedenle bu genel nesne dönüştürücüsünün snippet'unu kullandım:Statik bir WeakHashMap

@FacesConverter(value = "objectConverter") 
public class ObjectConverter implements Converter { 

private static Map<Object, String> entities = new WeakHashMap<Object, String>(); 

@Override 
public String getAsString(FacesContext context, UIComponent component, Object entity) { 
    synchronized (entities) { 
     if (!entities.containsKey(entity)) { 
      String uuid = UUID.randomUUID().toString(); 
      entities.put(entity, uuid); 
      return uuid; 
     } else { 
      return entities.get(entity); 
     } 
    } 
} 

@Override 
public Object getAsObject(FacesContext context, UIComponent component, String uuid) { 
    for (Entry<Object, String> entry : entities.entrySet()) { 
     if (entry.getValue().equals(uuid)) { 
      return entry.getKey(); 
     } 
    } 
    return null; 
} 

} 

Similliar soruları için zaten birçok answers var, ama ben bir vanilya çözümü istiyorum (* yüzü olmayan). aşağıdaki noktaları hala benim pasajı kalitesi hakkında beni belirsiz bırakın:

  1. kolay, neden genel bir nesne dönüştürücü JSF içine orada inşa olmadığını olsaydı?
  2. Neden bu kadar çok kişi hala SelectItems kullanıyor? Genel yaklaşımı kullanarak daha fazla esneklik yok mu? Örneğin. # {dto.label} hızlıca # {dto.otherLabel} şeklinde değiştirilebilir.
  3. Gözden geçirmenin sadece görünüm ve model arasında bir eşleme olduğunu düşünürsek, genel yaklaşımın önemli bir dezavantajı var mıdır?

cevap

6

Bu yaklaşım, hacky ve bellek verimsizdir.

Küçük bir uygulamada "tamam" dır, ancak kesinlikle f:selectItems numaralı belgede atıfta bulunulabilecek onlarca veya yüz binlerce potansiyel varlıkla büyük bir uygulamada kesinlikle bulunmaz. Ayrıca, böyle büyük bir uygulama genel olarak ikinci seviye bir varlık önbelleğine sahiptir. WeakHashMap o zaman işe yaramaz hale gelir ve sadece bir varlık fiziksel olarak temel veri deposundan (ve dolayısıyla ikinci seviye varlık önbelleğinden) kaldırıldığında etkili olur.

Kesinlikle "eğlenceli" bir faktöre sahiptir, ancak "ağır üretimde" kullanmanızı gerçekten tavsiye etmem.

Halihazırda bulunduğunuz gibi, OmniFaces SelectItemsConverter gibi bir yardımcı kitaplıktan varolan bir çözümü kullanmak istemiyorsanız, temelde tamamen durum bilgisi olmayan ve herhangi bir DAO/Service çağrısı kullanmıyorsanız, en iyi seçeneğiniz ortak bir temel arayüzü/varlıkları olan varlıklarınızı ve bunun yerine dönüştürücüyü kancalayın. Bu sadece bir DAO/Servis çağrısı gerektiriyor. Bu, bu Q & A: Implement converters for entities with Java Generics'da ayrıntılı olarak ortaya konmuştur.

İlgili konular