[seam-dev] How to "clear" something from a context

pmuir at redhat.com pmuir at redhat.com
Fri May 8 05:51:54 EDT 2009


Two points here

- you are assuming that there is the same performance overhead in  
seam2. Not true, assuming you don't apply an interceptor explicitly  
(security @Restrict, @Transactional, there is minimal overhead  
(maximum is the lookup of the object in a context, or for dependent,  
none)
- using a producer field is even lighter
- this does raise the point that we don't have a truly stateless scope  
where the result is produced every time (imagine injecting a produced  
user into a session scoped bean. Gavin, any hints?)

--
Pete Muir
http://in.relation.to/Bloggers/Pete

On 8 May 2009, at 08:19, Gavin King <gavin.king at gmail.com> wrote:

> Have you met producer fields yet?
>
> On Fri, May 8, 2009 at 2:06 AM, Dan Allen <dan.j.allen at gmail.com>  
> wrote:
>> I'll start by saying true, on some level that does work. And it's
>> reasonable.
>>
>> However, it challenges one of the core principles in Seam. You can  
>> argue
>> whether that matters, but let's just follow this point. Seam  
>> focused on
>> avoiding where possible the use of getter methods to access data.  
>> Instead,
>> data was "pushed out" into top-level context variables where they  
>> could be
>> accessed without an intermediary. The reason this was done is to  
>> avoid
>> repeated invocation of getter methods. It's specially a solution that
>> targets JSF since JSF bombards getter methods during the life cycle
>> processing. Presuming that each method call is intercepted, there  
>> is a
>> moderate to severe performance hit as a result.
>>
>> Looking at your case, you have reduced the number of calls to once  
>> per
>> request. That's alleviates the performance problem and allows the  
>> user to be
>> an independent variable for at least the scope of the request.  
>> However, it
>> behaves very badly with a JSF postback. Why? When the request  
>> begins, JSF
>> produces the user, which prior to login is some transient/blank  
>> User object.
>> During the postback, the user logs in, effectively updating the  
>> User object
>> to a managed entity. But what remains in the request scope is the
>> transient/blank User object. What you need is for the producer to  
>> reproduce
>> at that point.
>>
>> One way around the dilemma I just cited is to redirect before  
>> render, so as
>> to break your association with the current request scope and have  
>> the user
>> produced again on the next request. However, it seems pretty ugly  
>> to me to
>> have to redirect just to clear the result of a request-scoped  
>> producer
>> method you need to reset.
>>
>> Would it be possible to have the producer method observe and event  
>> that
>> would force it to produce again? That would solve most of the  
>> cases....and
>> certainly it would solve this case.
>>
>> If that isn't possible, you have to change the scope of @Produces  
>> @LoggedIn
>> getCurrentUser() to @Dependent, which is nothing more than an alias  
>> for the
>> getter method...the point I started with.
>>
>> -Dan
>>
>> On Thu, May 7, 2009 at 7:18 AM, Pete Muir <pmuir at redhat.com> wrote:
>>>
>>> This is something that was quite commonly needed in Seam, in part  
>>> due to
>>> the use of outjection. As 299 doesn't support outjection, you need  
>>> to use
>>> the manager pattern:
>>>
>>> @SessionScoped
>>> public class Login {
>>>
>>>   public User user;
>>>
>>>   public Login(@New User user) {
>>>      // Initialize with an empty, new, user - the "not logged in"  
>>> user
>>>      this.user = user;
>>>   }
>>>
>>>   public void login(User user) {
>>>      // Log in a real user
>>>      this.user = user;
>>>   }
>>>
>>>   @Produces @LoggedIn @RequestScoped
>>>   public User getCurrentUser() {
>>>      return user;
>>>   }
>>>
>>> }
>>>
>>> This is much cleaner :-)
>>>
>>>
>>> --
>>> Pete Muir
>>> http://www.seamframework.org
>>> http://in.relation.to/Bloggers/Pete
>>>
>>> _______________________________________________
>>> seam-dev mailing list
>>> seam-dev at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/seam-dev
>>
>>
>>
>> --
>> Dan Allen
>> Senior Software Engineer, Red Hat | Author of Seam in Action
>>
>> http://mojavelinux.com
>> http://mojavelinux.com/seaminaction
>> http://in.relation.to/Bloggers/Dan
>>
>> NOTE: While I make a strong effort to keep up with my email on a  
>> daily
>> basis, personal or other work matters can sometimes keep me away
>> from my email. If you contact me, but don't hear back for more than  
>> a week,
>> it is very likely that I am excessively backlogged or the message was
>> caught in the spam filters.  Please don't hesitate to resend a  
>> message if
>> you feel that it did not reach my attention.
>>
>> _______________________________________________
>> seam-dev mailing list
>> seam-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/seam-dev
>>
>>
>
>
>
> -- 
> Gavin King
> gavin.king at gmail.com
> http://in.relation.to/Bloggers/Gavin
> http://hibernate.org
> http://seamframework.org



More information about the seam-dev mailing list