27 Temmuz 2014 Pazar

JSF selectOneMenu de Object Kullanımı

Öncelikle herkese iyi bayramlar diyerek yazıma başlıyorum.

Bu konu ile alakalı yazacağım örnek uygulama da;

-EJB 3.0
-JSF 2.2
-PrimeFaces 4.0
 teknolojilerini kullanarak GlassFish Server 4.0 üzerinde geliştirdim.

Daha önce ki yazılarımdan birinde JSF de selectOneMenu componentinin kullanımından bahsetmiştim.Buradan yazıya ulaşabilirsiniz.

Orada ki örnek de <f:selectItem> ın value su bir String list di. Fakat bize gelen değerler her zaman String olmayabilir.Yani custom type larda dönebilir.Dolayısıyla selectOneMenu nün value su da o custom type ın tipi olur. İşte tam bu zamanda da imdadımıza converter yetişir.

Çünkü custom type bean e gönderildiği zaman set edilemez ve aşağıda ki hatayı bize fırlatır.

Conversion Error setting value xxxxx.CustomType@1234567' for 'null Converter'.

İşte bu hatadan kurtulmak için kendi converter ımızı yazmamız gerekir.Lafı fazla uzatmadan artık kodlamaya başlayalım.

ValueListDetail.java

public class ValueListDetail implements Serializable{
      
       private static final long serialVersionUID = 1L;
      
       @Id
       @Column(name = "ID")
       private Integer valueId;
      
       @Column(name = "ACIKLAMA")
       private String description;

       public Integer getValueId() {
             return valueId;
       }

       public void setValueId(Integer valueId) {
             this.valueId = valueId;
       }

       public String getDescription() {
             return description;
       }

       public void setDescription(String description) {
             this.description = description;
       }

       @Override
       public int hashCode() {
             final int prime = 31;
             int result = 1;
             result = prime * result + ((valueId == null) ? 0 : valueId.hashCode());
             return result;
       }

       @Override
       public boolean equals(Object obj) {
             if (this == obj)
                    return true;
             if (obj == null)
                    return false;
             if (getClass() != obj.getClass())
                    return false;
             ValueListDetail other = (ValueListDetail) obj;
             if (valueId == null) {
                    if (other.valueId != null)
                           return false;
             } else if (!valueId.equals(other.valueId))
                    return false;
             return true;
       }     
      
}

selectOneMenu muzu dolduracak Dao aşağıda ki gibidir.

GeneralDao.java

public class GeneralDaoImpl<T> {

private final static String UNIT_NAME ="KutuphaneOtomasyonuEJB";
      
       @PersistenceUnit(unitName = UNIT_NAME)   
       private EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory(UNIT_NAME);
       private EntityManager em = emf.createEntityManager();
      
       private static Connection getConnection(){
             Connection dbConnection = null;
             try {
                    Class.forName("com.mysql.jdbc.Driver").newInstance();
                    dbConnection = DriverManager.getConnection("jdbc:mysql://localhost:3307/kutuphane", "root", "root");
             } catch (Exception e) {
                    e.printStackTrace();
             }
            
             return dbConnection;
       }
      
       @SuppressWarnings("unchecked")
       public List<ValueListDetail> findAllValues(){
             return em.createNamedQuery("findAllValueList").getResultList();
       }
      
       public ValueListDetail findValuebyId(Integer id){
             return em.find(ValueListDetail.class, id);
       }
}

Buradan gelen değerleri convert eden class aşağıda ki gibidir.

ValueListDetailConverter.java

@FacesConverter(forClass = com.mesutemre.valuelistdetailconverter.ValueListDetailConverter.class, value = "valueListDetailConverter")
public class ValueListDetailConverter implements Converter {

       @EJB
       private GeneralFacade service;

       @Override
       public Object getAsObject(FacesContext context, UIComponent component,
                    String submittedValue) {
             if (submittedValue.trim().equals("")) {
                    return null;
             } else {
                    try {

                           return service.findValuebyId(Integer.valueOf(submittedValue));
                    } catch (NumberFormatException exception) {
                           throw new ConverterException(new FacesMessage(
                                        FacesMessage.SEVERITY_ERROR, "Conversion Hatası",
                                        "Geçersiz değer!"));
                    }
             }

       }

       @Override
       public String getAsString(FacesContext context, UIComponent component,
                    Object value) {
             if (value == null || value.equals("")) {
                    return "";
             } else {
                    return String.valueOf(((ValueListDetail) value).getValueId());
             }
       }

}

Gördüğümüz üzere converter yazmak oldukça basit.Bu class ValueListDetail objectini String ' e ya da tersine dönüştürür.


ValueListDetail list aşağıda ki gibi ManagedBean de dolar.

@ManagedBean(name = "kitapKayitBean")
@ViewScoped
public class KitapKayitBean implements Serializable {

       private static final long serialVersionUID = 1L;

       private List<ValueListDetail> ilgiAlanList = new ArrayList<ValueListDetail>();
       private ValueListDetail ilgiValue;

       @EJB
       private GeneralFacade generalFacade;

      
       private void initİlgiAlanList() {
             ilgiAlanList = generalFacade.findAllValues();
       }
       public List<ValueListDetail> getIlgiAlanList() {
             return ilgiAlanList;
       }

       public void setIlgiAlanList(List<ValueListDetail> ilgiAlanList) {
             this.ilgiAlanList = ilgiAlanList;
       }

       public ValueListDetail getIlgiValue() {
             return ilgiValue;
       }

       public void setIlgiValue(ValueListDetail ilgiValue) {
             this.ilgiValue = ilgiValue;
       }

}

Önyüz de kullanırken de converter attribute ünü ve converter ın adını kullanmak yeterli olacaktır. Bu işlem aşağıda ki gibidir.

<p:selectOneMenu value="#{kitapKayitBean.ilgiValue}" converter="valueListDetailConverter" required="true" filter="true"              id="kitapkayitkitaptur"    requiredMessage="#{res['ko.warning.emptyBookType']}">

<f:selectItems value="#{kitapKayitBean.ilgiAlanList}" var="ial"                                 itemLabel="#{ial.description}"/>

</p:selectOneMenu>


Hiç yorum yok:

Yorum Gönder