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?
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 .
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.
@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ć.
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.
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.
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