Circular Injection causes Null Pointers: bug or limitation?
kragoth Oct 6, 2009 7:50 AMHey all,
I've got the following bit of code.
UserMaintenanceController class
...imports
@Name(UserMaintenanceController.SEAM_ID)
@Scope(ScopeType.CONVERSATION)
public class UserMaintenanceController extends AbstractModuleController {
...other variables
@In(value = NavigationManager.SEAM_ID, required = true)
private NavigationManager navMan;
@In(value = UserDetailsTabDataBean.SEAM_ID, create = true)
private UserDetailsTabDataBean detailsTab;
public void gotoUserMaintenance(User user, BackNavigation exitAction) {
Validate.notNull(exitAction, "param exitAction cannot be null");
this.exitAction = exitAction;
this.user = user;
if (user == null) {
setFormMode(FormMode.CREATE);
} else {
setFormMode(FormMode.VIEW);
}
loadUser(); //ALL INJECTED VARIABLES ARE FINE UP TO THIS POINT
detailsTab.init(); //AFTER THIS LINE navMan IS NULL
navMan.lockGlobalNavigation();
navMan.redirectToModule(
this.getConversationId(),
USER_DETAILS_URL,
MODULE_BREADCRUMB_ID,
DETAILS_BREADCRUMB_ID);
}
...the rest of this class but it doesn't matter.
}
And then in the UserDetailsTabDataBean class
... imports
@Name(UserDetailsTabDataBean.SEAM_ID)
@Scope(ScopeType.CONVERSATION)
public class UserDetailsTabDataBean extends AbstractSeamComponent {
...other variables
@In(value = UserMaintenanceController.SEAM_ID, required=true)
private UserMaintenanceController userMaintenanceCtrl;
public void init() {
locations =
listHelper.fetchActivePersistentEntityListAndInclude(
Location.class,
userMaintenanceCtrl.getUser().getUserLocation(),
"description");
titles =
listHelper.fetchActivePersistentEntityListAndInclude(
Title.class,
userMaintenanceCtrl.getUser().getTitle(),
"description");
districtOffices =
listHelper.fetchActivePersistentEntityListAndInclude(
DistrictOffice.class,
userMaintenanceCtrl.getUser().getDefaultDistrictOffice(),
"description");
ranks = Arrays.asList(SecurityRank.values());
Collections.sort(ranks);
}
}
Ok, so whenever I make a call to UserMaintenanceController.gotoUserMaintenance(user, exitAction), I end up with all my Seam injected variables being null. I've marked the line where it happens in the code. It happens when I make a call to another Seam bean that also injects the UserMaintenanceController. So I do have a circular injection path. But, should this cause me to end up with null variables when the call to the other Seam bean is over? I thought I saw somewhere in the Seam codebase some logic that was supposed to stop this from happening (spent a while digging around to learn what was going on).
I'm running Seam 2.1.0.GA.
I guess all I want to know is: Should I change my code to get around this problem or is this as bug that I should raise? Because the fix isn't that hard, it's just annoying. I have to extract my navigation methods out to a different Seam bean so that there is no circular injection.