sorry, this is a long one...
I have a use case which may require two SFSB's for a facelet. The facelet has
a h:dataTable and a rich:modalPanel (which has a4j:form embedded in it). The
main SFSB for the dataTable's form was conversation scoped. I am using the
@Factory and @DataModel tag team annotations to outject the DataModel List for
the dataTable in the facelet.
The second SFSB which handles form submissions from a rich:modalPanel was
session scoped b/c the popup form submissions are not immediately persisted to
the DB tables. I was injecting the second SFSB into the main SFSB (which I'm
not sure is a good idea or not with Seam apps).
So I decided to refactor this implementation and move all the
logic/methods/variables from the second SFSB into the main SFSB (idea being to
have one SFSB per facelet).
I've tried different combinations of configurations with the @Factory
annotation and have found the following (as is basically explained on pg. 68 of
the Seam reference pdf for 2.0.0.GA):
Since now there is only one SFSB and it is session scoped (to keep track of the
modalPanel submitted form data until the main form is submitted), I needed a
conversation or request scoped Factory method. Otherwise, the factory method
will only be called once per session. There are multiple submit buttons (one
per row) on the main form. So when user submits a row for persistence, the
Factory method needs to fire again before dataTable is re-rendered so that the
data is current.
So I tried the first style as below:
@Factory(value="customerList",scope=ScopeType.CONVERSATION)
| public List<Customer> getCustomerList() {
| return ... ;
| }
The problem with this solution is that I get
java.lang.NumberFormatException: For input string: "rowCount"
when I check for the List's rowCount in the facelet as below:
<h:dataTable value="#{customerList}" rendered="#{customerList != null and
customerList.rowCount > 0}">
Also, method not found for #{customerList.getRowIndex()}
I think the reason I'm having these problems is b/c the @DataModel is not being
used and therefore no outjection of a DataModel object that the JSF can use to
render the dataTable (i.e. a regular List does not have a rowCount property or
getRowIndex() method). I'm not sure I can even use a DataModel with this first
style.
So I try the second style as follows:
@DataModel List<Customer> customerList;
|
| @Factory("customerList")
| public void initCustomerList() {
| customerList = ... ;
| }
The problem with this solution is that b/c the @Factory annotation can't have a
conversation scope when the method returns void, the initCustomerList() method
will only get executed once per session (and I need it to exec per
request/conversation).
So what am I doing wrong and/or how can I solve this use case with a single
facelet, a single SFSB, and ...??? I think I tried PAGE scope with @DataModel
and it didn't help or work. From the Bauer talk it sounds like PAGE context is
useful with Ajaxified Seam apps.
I looked at the @Unwrap and manager component pattern as well but that forces
the annotated method to be called every time the context variable is referenced
(I'm assuming in the facelet???) So not sure if that's appropriate or not.
Sounds like if I can get rowCount of the List and getRowIndex() equivalent for
the List, I might be ok EXCEPT for I lose out on the @DataModelSelection and
@DataModelSelectionIndex for processing a clicked row in the dataTable (which
in this case, the query is based on two tables/entities).
Basically: how can I get this to work for my use case with @Factory and the
@DataModel* anntotations with one facelet and one SFSB???
Please help, I'm frustrated and confused... thx.
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4103404#4103404
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4103404
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user