我正试图使用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