Wtrysk CDI do twarzy

Z zaledwie kilku wyszukiwań wynika, że jest to problem, który istnieje już od jakiegoś czasu. Napisałem FacesConverter, który wygląda następująco. Obiekt Kategoria jest encją JPA i CategoryControl jest DAO, które ją pobiera.

@FacesConverter(value = "categoryConverter")
public class CategoryConverter implements Converter {

@Inject private CategoryControl cc;

public CategoryConverter() { }

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    if (cc != null) return cc.getByName(value);
    System.out.println("CategoryConverter().getAsObject(): no injection!");
    return null;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (!(value instanceof Category)) return null;
    return ((Category) value).getName();
}

}

Jak już pewnie się domyśliłeś, nigdy nie dostaję zastrzyku. Mam to obejście z tej strony , które wygląda tak.:

Workaround for this problem: create this method in your localeController: 

public Converter getConverter() 
{ 
    return   FacesContext.getCurrentInstance().getApplication().createConverter("localeConverter"); 
} 

and use converter="#{localeController.converter}" in your h:selectOneMenu.
Ale to też nie zadziała. My back bean creates i zwraca konwerter, ale nie wstrzykuje do niego obiektu.

Używam MyFaces CODI 1.0.1. Z aktualnym pojemnikiem GlassFish / Weld. Czy ktoś może zasugerować rozwiązanie przed ponownym kodowaniem, aby nie używać konwertera?

Author: BalusC, 2011-09-23

4 answers

Zastąp

@FacesConverter(value = "categoryConverter")

By

@Named

I używać

<h:inputSomething converter="#{categoryConverter}" />

Lub

<f:converter binding="#{categoryConverter}" />

Zamiast

<h:inputSomething converter="categoryConverter" />

Lub

<f:converter converterId="categoryConverter" />

Nawiasem mówiąc, podobny problem istnieje dla @EJB wewnątrz @FacesConverter. Oferuje jednak sposób na ręczne złapanie JNDI. Patrz również komunikacja w JSF 2.0 - uzyskanie EJB w @ FacesConverter i @FacesValidator. W ten sposób możesz użyć @FacesConverter(forClass=Category.class) bez ręcznego definiowania go za każdym razem. Niestety nie mogę stwierdzić z góry jak sobie z tego poradzić w przypadku fasoli CDI.


Update : jeśli zdarzy ci się użyć biblioteki JSF utility OmniFaces, od wersji 1.6 dodaje przezroczyste wsparcie dla używania @Inject i @EJB w klasie @FacesConverter bez dodatkowej konfiguracji lub adnotacji. Zobacz także CDI @FacesConverter przykład prezentacji .

 54
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-05 07:32:21

Adnotacja @Inject działa tylko w instancjach zarządzanych przez CDI. Jeśli chcesz używać funkcji CDI wewnątrz instancji zarządzanej nie-CDI (jak walidator JSF lub konwerter JSF), możesz po prostu programować za pomocą API CDI.

To działa tylko na serwerze Java EE 7 + CDI 1.1.
@FacesValidator("userNameValidator")
public class UserNameValidator implements Validator {

    private UserService userService;

    public UserNameValidator(){
        this.userService = CDI.current().select(UserService.class).get();
    }

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
     ....
    }
}

Https://docs.oracle.com/javaee/7/api/javax/enterprise/inject/spi/CDI.html

Z tymi wszystkimi adnotacjami w Java EE ludzie zapominają jak kodować.

 5
Author: Surprised Coconut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-08 13:54:52

Po prostu użyj @ Advanced z CODI dla @FacesConverter zobacz Wiki.

Jak tylko konwerter lub walidator zostanie opatrzony adnotacją @Advanced, możliwe jest użycie @Inject.

 3
Author: Dar Whi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-05 07:49:02

Per balusc ' s answer tutaj , zdecydowałem się dodać JSF (requestscoped) managed beans, który zawierał tylko @FacesConverter i konwerter, aby rozwiązać ten problem w mojej aplikacji, ponieważ jestem migracji z JSF managed beans do CDI managed beans.

Próbowałem CODI @ Advanced przeciwko @ FacesConverter, ale nie wstrzykuje fasoli w ogóle.

 2
Author: Howard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:35