Injecting a CDI SessionScoped bean into a JSF ValueChangeLis



我正试图使用javax.faces.event.ValueChangeListener来对抗类似的h:selectOneMenu

<h:selectOneMenu value="#{localeBean.languageCode}" onchange="submit()">
    <f:selectItem itemLabel="English" itemValue="en" />
    <f:selectItem itemLabel="German" itemValue="de" />
    <f:valueChangeListener  type="org.bitbucket.paulstat.jsf.event.ExampleValueChangeListener" />
</h:selectOneMenu>

这是侦听器

import javax.faces.event.AbortProcessingException;
import javax.faces.event.ValueChangeEvent;
import javax.faces.event.ValueChangeListener;
import javax.inject.Inject;
import org.bitbucket.paulstat.jsf.localisation.LocaleBean;
public class ExampleValueChangeListener implements ValueChangeListener {
    @Inject
    private LocaleBean localeBean;
    @Override
    public void processValueChange(ValueChangeEvent event) throws AbortProcessingException {
        localeBean.setLanguageCode(event.getNewValue().toString());
        localeBean.switchLocale();
    }
}

LocaleBean

import java.io.Serializable;
import java.util.Locale;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;
@Named
@SessionScoped
public class LocaleBean implements Serializable {
    private String languageCode;
    public void switchLocale() {
        FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale(languageCode));
    }
    public void setLanguageCode(String languageCode) {
        this.languageCode = languageCode;
    }
    public String getLanguageCode() {
        return languageCode;
    }
}

LocaleBean似乎没有被注入到值更改侦听器中,并且为null。我们可以将SessionScoped CDI bean与JSF ValueChangeListeners混合使用吗?

@Inject仅在CDI管理的bean中工作。您的ExampleValueChangeListener不是CDI管理的bean。

让它成为一体。最简单的方法是将@Named注释放在上面,这样它就可以在EL.中使用

@Named
public class ExampleValueChangeListener implements ValueChangeListener {
    // ...
}

通过binding而不是type引用它。

<f:valueChangeListener binding="#{exampleValueChangeListener}" />

另请参阅:

  • 如何使用@EJB、@PersistenceContext、@inject、@Autowired在@FacesValidator中注入
  • 如何在@FacesConvert中注入@EJB、@PersistenceContext、@inject、@Autowired等
  • 会话范围的托管bean和actionListener

最新更新