Difficulty with ImportHandler#importClass()
pgarner Oct 26, 2014 1:29 PMThe following bean seems to load fine upon startup and when facelets are loaded, as evidenced by the log:
@ManagedBean(eager=true)
@ApplicationScoped
public class EnumConfig {
@PostConstruct
public void init() {
System.out.println("Testing 123...");
FacesContext.getCurrentInstance().getApplication().addELContextListener (
new ELContextListener() {
@Override
public void contextCreated(ELContextEvent event) {
System.out.println("Testing 456...");
ImportHandler importHandler = event.getELContext().getImportHandler();
importHandler.importClass("foo.bar.business.model.enumeration.YesOrNo");
Class<?> clazz = importHandler.resolveClass("YesOrNo");
System.out.println("class = " + clazz);
}
}
);
}
}
21:26:48,703 INFO [stdout] (MSC service thread 1-4) Testing 123... 21:39:11,976 INFO [stdout] (default task-9) Testing 456... 21:39:11,976 INFO [stdout] (default task-18) class = null
YesOrNo is not imported because clazz == null in EnumConfig code snippet. This is a problem. And as expected the value expression can't resolve YesOrNo#values(). The select list is rendered empty, with no YesOrNo values.
<f:selectItems
value="#{YesOrNo.values()}"
var="yesOrNo"
itemValue="#{yesOrNo}"
itemLabel="#{yesOrNo.name()}"/>
I set a breakpoint after ImportHandler#importClass and I can see that classNameMap is properly populated:
importHandler = {javax.el.ImportHandler@17821}
classNameMap = {java.util.HashMap@17822} size = 1
[0] = {java.util.HashMap$Node@17830}"YesOrNo" -> "foo.bar.business.model.enumeration.YesOrNo"
classMap = {java.util.HashMap@17823} size = 0
staticNameMap = {java.util.HashMap@17824} size = 0
notAClass = {java.util.HashSet@17825} size = 0
packages = {java.util.ArrayList@17826} size = 1
[0] = {java.lang.String@17286}"java.lang"
value = {char[9]@17287}
hash = -888658374
So, classNameMap is populated correctly but the import handler cannot resolve the class. The JavaDoc for ImportHandler#resolveClass() indicates I am using it correctly (without package name). Why is import handler unable to resolve the class?
FYI, using <o:importConstants> of OmniFaces works just fine.
<o:importConstants type="foo.bar.business.model.enumeration.YesOrNo"/>
What can I do to further troubleshoot this problem?