Ö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