Merhaba arkadaslar,

bir jsf + cdi uygulamasinda bean converterler nasil yapilmali?

Istedigim aslinda söyle bir kod:

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.inject.Inject;

@FacesConverter(forClass = Car.class, value = CarConverter.CONVERTER_ID)
public class CarConverter implements Converter {

public static final String CONVERTER_ID = "car.converter.id";

@Inject
private CarService carService;

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    return carService.findById(Long.valueOf(value));
}

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

}

Ancak calismiyor.

Injection burda mümkün degil. Named diye atlandirip kullanmak mümkün. Bu seferde converter=#{carConverter} diye cagirmam lazim. Bunu ben istemiyorum.

Beanfactory ile CarService i cagirmam mümkün. Ama bu dogru mu? Performnanz problemleri getirir mi?

Sizce nasil yapmaliyim. En dogrusu hangisidir?

Seam Faces integre etmek de istemiyorum.

Selamlar

soruldu: 23 Nis '13, 09:53

mahmut_can's gravatar image

mahmut_can ♦
2.9k62552
cevap kabul oranı: 67%

değiştirildi: 24 Nis '13, 02:45

CemIkta's gravatar image

CemIkta ♦
19.9k29125190

Injection neden mümkün değil bunu anlamadım. Bean olsun olmasın CarService sınıfı orada enjekte edilir.

(24 Nis '13, 05:48) lazy lazy's gravatar image

Bir dene istersen.

(24 Nis '13, 06:30) mahmut_can ♦ mahmut_can's gravatar image

Denedim. Car sınıfını managedbean olarak tanımladım, index.xhtml de convertırı <h:inputtext value="#{&lt;a href=" http:="" car.id"="">car.id}" converter="car.converter.id"/> inputtextte böyle bağladım. Form gönderildiğinde converter içinde CarService referansıyla metodların çağrıldığını görüyorum. Yani enjeksiyon yapılmış. JDK 1.7 JSF 2.2 kullanıyorum.

(24 Nis '13, 07:04) lazy lazy's gravatar image

Car sinifini da göre bilirmiyim

(24 Nis '13, 07:08) mahmut_can ♦ mahmut_can's gravatar image

@ManagedBean @RequestScoped public class Car {

private Long id;

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

}

(24 Nis '13, 07:17) lazy lazy's gravatar image

Merhaba,

  1. Bu CDI degil
  2. Car sinifi entity olacak. (@ManagedBean ya da @RequestScoped olmaz)
  3. Converterinde injection gercekten calisiyor mu, bilemiyorum. Ama tahmin etmiyorum.

Yardimin icin tekrar cok tesekkürler

(24 Nis '13, 07:24) mahmut_can ♦ mahmut_can's gravatar image
1

@lazy @mahmut_can ve benim bahsettigim JSF 2.1 icindi. JSF 2.2'de de hala Converters ve Validators inject targets degildir sadece ManagedBeans inject targets olarak tanimlanmistir diyor.Herkes sikayetci oldugu icin bu ozellik JSF 2.3'e eklenecekmis. http://jdevelopment.nl/jsf-22/ - linkteki Injection / Annotations bolumu.

@lazy eger sizin orneginizde CarService @Stateless yada @Stateful ise ve icinde @Inject EntityManager yapiyorsaniz hata almaniz yada inject'in calismamasi gerekir! Yine de calisiyorsa kodlari paylasirsaniz test etmek isterim.

@lazy aciklama icin tesekkurler.

(24 Nis '13, 07:30) CemIkta ♦ CemIkta's gravatar image

Neden CDI değil. Car sınıfının entity olmasıyla CarService enjeksiyonunun ilgisi ne, uygulamanızın detaylarını paylaşmadığınız için bilemiyorum. Evet enjeksiyon çalışıyor. Car entity olduğunda da çalışıyor. ManagedBean sınıfını şöyle değiştirdim.

@ManagedBean 
@RequestScoped
public class Bean {

private Car car = new Car();

public Car getCar() {
    return car;
 }

public void setCar(Car car) {
    this.car = car;
 }
}

Convert getasstring metodunda System.out.println(carService.getId()); nullpointer fırlatmıyor.

(24 Nis '13, 07:49) lazy lazy's gravatar image

Bu koda bir zahmet göz atiniz.

https://gist.github.com/canmahmut/5452012

(24 Nis '13, 07:56) mahmut_can ♦ mahmut_can's gravatar image
1

@CemIkta hayır, CarService pojo. İçinde entityManager enjeksiyonu da yoktu. @PersistenceContext ile yaptım(@Inject ile hata alınır zaten) çalıştı. Pojoyu stateless statefull yaptığımda ise formu post ettikten sonra hata aldım. Sayfa görüntülenirken en başta, getasstring metodu içinde yine carservice hatasız erişiliyor.

(24 Nis '13, 08:55) lazy lazy's gravatar image
1

Servicesiz calisan bir yöntem daha:

@FacesConverter(forClass = Car.class, value = CarConverter.CONVERTER_ID)
 public class CarConverter implements Converter {

public static final String CONVERTER_ID = "car.converter.id";

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    // Burasi daha iyi ola bilir
    UISelectItems listBox = (UISelectItems) component.getChildren()
        .get(0);
    return findCar(listBox.getValue(), value);
}

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

// Burasi daha iyi ola bilir
@SuppressWarnings("unchecked")
private Object findCar(Object object, String value) {
    Long id = Long.valueOf(value);
    for (Car car : (ArrayList<Car>) object) {
        if (id.equals(car.getId())) {
            return car;
        }
    }
    return null;
}

}

  @Named
  @RequestScoped
   public class CarController {

private Car selectedCar;

private List<Car> cars; ..... }

XHTML:

<h:form>
    <p:selectOneListbox value="#{carController.selectedCar}"
        converter="car.converter.id">
        <f:selectItems value="#{carController.cars}" var="car"
            itemLabel="#{car.id}" itemValue="#{car}" />
    </p:selectOneListbox>
    <p:commandButton value="ACtion" action="#{carController.action}"
        update="output" process="@form" />

&lt;h:outputText value="#{carController.selectedCar}" id="output" /&gt;

</h:form>

(25 Nis '13, 07:03) mahmut_can ♦ mahmut_can's gravatar image
11 yorumdan 5 tanesi gösteriliyor hepsini göster

Service classi @Inject ile almak yerine controller classi alip controller.getService yada controller.service.findById() seklinde kullanabilirsiniz. Zaten service instance controller icinde @Inject edilmis olmali.


  @Override
  public Object getAsObject(FacesContext context, UIComponent component, String value) {
    if (value == null || value.length() == 0) {
      return null;
    }
    CarController controller = (CarController) facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "carController");
    return controller.service.findById(Long.valueOf(value));
    // veya getService() ile
    // return controller.getService().findById(Long.valueOf(value));
  }

permanent link

cevaplandı: 24 Nis '13, 02:53

CemIkta's gravatar image

CemIkta ♦
19.9k29125190
cevap kabul oranı: 36%

Merhaba cem abi,

beanfacotory ile injection yapma imkanim var. Ama bu sence dogru bir yol mu?

Her rendering yapildiginda bu metod defalarca cagriliyor. Bun da bir sIkinti var mi? Caching mekanismasi da mi iyi olur?

Selamlar

(24 Nis '13, 02:57) mahmut_can ♦ mahmut_can's gravatar image

Beanfacotry ile:

 public <T> T getBeanByName(String name, Class<T> beanType) {
    BeanManager bm = getBeanManager();
    Bean<?> bean = bm.getBeans(name).iterator().next();
    Object reference = bm.getReference(bean, beanType,
            bm.createCreationalContext(bean));

return (T) reference;
}
public BeanManager getBeanManager() {
    try {
        InitialContext initialContext = new InitialContext();

return (BeanManager) initialContext.lookup("java:comp/BeanManager");
    } catch (NamingException e) {
        e.printStackTrace();

return null;
    }
}
(24 Nis '13, 03:02) mahmut_can ♦ mahmut_can's gravatar image

InitialContext'den de erisilebiliyor yazdigin gibi. Ben BeanManager ile hic denemedim, Netbeans 7.3 demo projelerinde service instance'a controller uzerinden erisiliyor. Genelde cozumler senin de belirttigin gibi, ya Converter class'i @ManagedBean, @Named bean'e cevirmek, ya BeanManager yada Seam Faces ile converter icine bircok classi @Inject edebilme.

(24 Nis '13, 03:16) CemIkta ♦ CemIkta's gravatar image

Peki, sence performanz acisindan problem olur mu?

(24 Nis '13, 03:17) mahmut_can ♦ mahmut_can's gravatar image

Yogun kullanimda ne kadar etkiler bilemiyorum acikcasi!

(24 Nis '13, 03:24) CemIkta ♦ CemIkta's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×281
×2

Soruldu: 23 Nis '13, 09:53

Görüntüleme: 1,132 kez

Son güncelleme: 02 May '13, 09:09

powered by BitNami OSQA