Asked By
Ruth W
140 points
N/A
Posted on - 04/30/2011
Hello techyV experts.
Dependency injection error in Java server faces managed form bean (Java 6 and JSF 2.0)I need help in diagnosing a dependency injection problem. I have a class in my web project that is calling an EJB3 bean.
I am using JSF 2.0 and have a managed bean that is handling the user interface. The managed bean is set as Request Scope. I am getting a null reference exception when i attempt to access the EJB reference in the constructor.
Error in Java server faces managed form bean
Java 6 introduced dependency injection that made life easier for the programmer by reducing the number of code. But it also introduced certain pre-checks that you need to do.
How dependency injection works is that:
1. First creates the base object.
2. Then it scans for injected references inside the base object.
3. Then creates each referred object.
4. Finally it sets the created objects to the respective private variables of the base object.
If you look at the steps, in order to inject the created instances, the base object must exist. If any attempt by the base object to refer to an injected reference before it being initialized, you will get a null reference exception.
Answered By
Ruth W
140 points
N/A
#89702
Error in Java server faces managed form bean
Are you saying that I cannot call an injected reference in the constructor of my form bean?
I did get a gist of what you explained.
Just to make sure, can you show me with respect to the code?
Error in Java server faces managed form bean
Yes. You cannot access a injection reference before it is initialized. You need to wait till the UIFormBean constructor completes execution.
public class UIFormBean {
@EJB private SkuManagerLocal skuManager;Â <= this is only initialized after the construction of the UIFormBean
public UIFormBean () {Â Â <= constructor called first
this.skuManager.initialize();Â Â <= you can't call this because it is not yet initialized. The UIFormBean has not been created as yet.
 }
}
Answered By
Ruth W
140 points
N/A
#89705
Error in Java server faces managed form bean
Now I understand! Thank you TechnoHat! But this puts me in a predicament! I need to call the EJB method prior to any other action in the UIFormbean! How do I call the EJB method in my bean if I cant call it in the constructor?
Error in Java server faces managed form bean
Create a public method in the UIFormBean and put the calling of the injected reference inside it. Then add a dummy JSF control and call the method of the UIFormBean. What I generally do is to create a boolean method signature and bind it to the Form tags "rendered" attribute. Since the form element is the first element after the JSF view element, the "rendered" attribute gets call first.
class UIFormBean {
@EJB private SkuManagerLocal
public UIFormBean() {Â // empty }
public Boolean init() {
   this.skuManager.initialize();
 return true;
}
In the JSF page i use:
<h:form rendered="#{uiForm.init}" ….
Answered By
Ruth W
140 points
N/A
#89707
Error in Java server faces managed form bean
Just for my understanding,
what if I change the RequestScope to SessionScoped in the managed bean?
Would I still be unable to call the references in the constructor?
I still feel this is a fundamental bug in Java 6!
Error in Java server faces managed form bean
You cannot call the injected reference inside a constructor if you are using dependency injection. Its by design.
There is always a give and a take. If you really need to call a reference inside a constructor,
You need to fallback to the old method of a context lookup.
Answered By
Ruth W
140 points
N/A
#89710
Error in Java server faces managed form bean
Thank you TechnoHat for taking your time to explain.
I learnt a lot! Thank You! I am sure to bug you in the future!
Error in Java server faces managed form bean
You are most welcome.
I will be at techyV website if you need to! Happy coding!