Outjection problem(s)
newlukai Oct 4, 2006 11:02 AMHi,
I didn't know how to search for this specific problem, so I started a new thread. I hope you don't mind.
I have a form which allows the user to enter some values, which are attached to a bean (called testactionToCreate). As the name says, this form should allow the user to create a new testaction. To specify a testaction the user can choose a testcase from a dropdown-list, but he doesn't need to. But as soon as he chooses a testcase, some fields on the page should be filled with the values of the testcase. Then the user adds some data and submits the form.
That's the idea.
The dropdown-list gets its entries from a stateful bean, the testcaseSelector. In this bean I defined a valueChangeListener which sets some values of the injected testactionToCreate. This works fine. After those values are set, the testactionToCreate is outjected.
Now comes my problem: I only see the attributes set by testcaseSelector if they are displayed in an output field like h:outputText.
Next step would be to save the testactionToCreate. The save method is defined in a third bean, called createTestaction. When the save method is invoked all attributes set by the testcaseSelector are null. And that's a problem, too. But I think it's related to the first problem.
Here is some code:
The entity bean (testactionToCreate):
@Entity @Table(name="TESTACTIONS") @Name("testaction") @Scope(ScopeType.SESSION) public class Testaction implements Serializable, Cloneable { private long m_ID; //... the attribute list is too long. Ask me, if you need more private Long m_TCaseID; private Long m_TObjID;
The bean saving the entitiy bean (createTestaction):
@Stateless @LoggedIn @Name("createTestaction") public class CreateTestactionAction implements CreateTestaction, Serializable { @PersistenceContext(unitName = "aresDatabase") private EntityManager em; @In @Valid private User user; @Valid @In(required=false) @Out(required=false) private Testaction testactionToCreate; @In(required=false) private Release selectedRelease; @Factory("testactionToCreate") public void initTestactionToCreate() { if(testactionToCreate != null) { return; } testactionToCreate = new Testaction(); testactionToCreate.setTesterUsrID(user.getID()); testactionToCreate.setValidatorUsrID(user.getID()); } @IfInvalid(outcome=Outcome.REDISPLAY) public String createTestaction() { // do something and return an outcome }
The bean managing the dropdown-list (testcaseSelector):
@Stateful @Scope(ScopeType.SESSION) @LoggedIn @Name("testcaseSelector") public class TestcaseSelection implements TestcaseSelector, Serializable { @PersistenceContext(unitName = "aresDatabase") private EntityManager em; @In(required=false) private Release selectedRelease; @In(required=false) @Out(required=false) private Testaction testactionToCreate; private Long lastSelectedReleaseID; @In(required=false) @Out(required=false, scope=ScopeType.SESSION) private Testcase selectedTestcase; private List<Testcase> testcases; public void valueChanged(ValueChangeEvent event) { setSelectedTestcaseNumber((Long) event.getNewValue()); if(selectedTestcase != null && testactionToCreate != null) { testactionToCreate.setTObjID(selectedTestcase.getTObjID()); testactionToCreate.setTCaseToken(selectedTestcase.getToken()); testactionToCreate.setTCaseDescr(selectedTestcase.getDescr()); } }
And the form:
<h:form> <div id="errors"><h:messages layout="table" /></div> <div class="buttonLine"> <h:commandButton action="#{createTestaction.createTestaction}" /> </div> <div id="release"> <h:outputText value="#{ares_messages.filter_release}: " /> <h:selectOneMenu value="#{releaseSelector.selectedReleaseNumberOnly}" onchange="submit()"> <f:selectItems value="#{releaseSelector.releaseItemsOnly}" /> </h:selectOneMenu> </div> <table cellpadding="0" cellspacing="0" border="0"> <tr> <th><h:outputText value="#{ares_messages.label_testaction_TesterUsrID}" /></th> <th><h:outputText value="#{ares_messages.label_testaction_TCaseID}" /></th> <th><h:outputText value="#{ares_messages.label_testaction_TObjID}" /></th> <th><h:outputText value="#{ares_messages.label_testaction_QATID}" /></th> <th><h:outputText value="#{ares_messages.label_testaction_SevID}" /></th> <th><h:outputText value="#{ares_messages.label_testaction_DevUsrID}" /></th> <th><h:outputText value="#{ares_messages.label_testaction_CompID}" /></th> <th> </th> </tr> <tr> <td> <h:selectOneMenu value="#{testactionToCreate.testerUsrID}"> <f:selectItems value="#{selectMenuHelper.testersWithEmptyEntry}" /> </h:selectOneMenu> </td> <td> <h:selectOneMenu value="#{testcaseSelector.selectedTestcaseNumber}" onchange="submit()" valueChangeListener="#{testcaseSelector.valueChanged}"> <f:selectItems value="#{testcaseSelector.testcaseItems}" /> </h:selectOneMenu> </td> <td><h:outputText value="#{testactionToCreate.TObjID}" /></td> <td><h:outputText value="#{testactionToCreate.QATID}" /></td> <td> <h:selectOneMenu value="#{testactionToCreate.sevID}"> <f:selectItems value="#{selectMenuHelper.severities}" /> </h:selectOneMenu> </td> <td> <h:selectOneMenu value="#{testactionToCreate.devUsrID}"> <f:selectItems value="#{selectMenuHelper.developers}" /> </h:selectOneMenu> </td> <td><h:outputText value="#{testactionToCreate.compID}" /></td> <td> </td> </tr> </table> <table cellpadding="0" cellspacing="0" border="0"> <tr> <th><h:outputText value="#{ares_messages.label_testobject_Token}" /></th> <th><h:outputText value="#{ares_messages.label_testaction_TCaseToken}" /></th> </tr> <tr> <td><h:outputText value="pending" /></td> <td><h:inputText value="#{testactionToCreate.TCaseToken}" style="width: 100%;" /></td> </tr> </table>
I tried several SessionTypes (PAGE, EVENT, SESSION and CONVERSATION) for the outjection of the bean testactionToCreate. I tried also to define testactionToCreate as a @Role of Testaction. Anything worked.
Has anybody an idea how to solve this problem?