I think you'd be happier if you went with @Transactional annotations
on your services.  It works out much better, IMHO.

On Wed, Oct 14, 2009 at 12:23 PM, Iain Reddick
<iain.redd...@beatsystems.com> wrote:
> I'm considering it :)
>
> There are a lot of benefits to doing transactions at service call level
> ("truthful" user feedback for one, not having to deal with requests for
> resources hitting the transaction filter being another). Spring's AOP
> support actually makes doing this as simple and maintainable as it's ever
> likely to be (@Transactional annotations, or marking a whole class as
> transactional), so if we decide it's necessary it is reasonably trivial to
> implement.
>
> The main pro for per-request transactions is the complete seperation of
> transaction concerns.
>
> In the meantime I have a Filter-based solution, or I can hook into the
> wicket request cycle.
>
> iainr
>
> For now,
> James Carman wrote:
>>
>> That's the problem with transaction-per-request.  Why not put your
>> transaction around your service/domain methods rather than around the
>> entire request cycle?
>>
>> On Wed, Oct 14, 2009 at 5:19 AM, Iain Reddick
>> <iain.redd...@beatsystems.com> wrote:
>>
>>>
>>> For anyone in this situation (having to use a transaction filter), here
>>> is a
>>> solution that uses a response wrapper to delay the redirect until after
>>> the
>>> transaction has completed:
>>>
>>> private class DelayedRedirectWrapper extends HttpServletResponseWrapper {
>>>
>>>      private String redirectLocation;
>>>            public DelayedRedirectWrapper(HttpServletResponse response) {
>>>          super(response);
>>>      }
>>>           �...@override
>>>      public void sendRedirect(String location) throws IOException {
>>>          redirectLocation = location;
>>>      }
>>>            public void doCachedRedirect() throws IOException {
>>>          if ( redirectLocation != null ) {
>>>              super.sendRedirect( redirectLocation );
>>>      }
>>>  }
>>> }
>>>
>>> This is then used in the filter's doFilter method like this:
>>>
>>> ...
>>> DelayedRedirectWrapper responseWrapper = new DelayedRedirectWrapper(
>>> response );
>>> beginTransaction();
>>> filterChain.doFilter( request, wrappedResponse );
>>> doCommit();
>>> endTransaction();
>>> responseWrapper.doCachedRedirect();
>>> ...
>>>
>>> You could easily put the redirect-delaying code in it's own filter, for
>>> re-usabilty.
>>>
>>>
>>> iainr
>>>
>>> Iain Reddick wrote:
>>>
>>>>
>>>> Hi,
>>>>
>>>> I'm working on a Wicket / Hibernate / Spring app, with a configuration
>>>> that uses spring's OSIV filter and my own transaction filter (basically
>>>> a
>>>> transaction per-request pattern).
>>>>
>>>> I've run into a problem involving the order of transaction commits and
>>>> redirect reponses (triggered by setResponsePage()).
>>>>
>>>> The problem state is shown below:
>>>>
>>>> 1. User submits a form to create a new entity
>>>> 2. Submit handler calls service to save new entity
>>>> 3. Submit handler calls setResponsePage for page showing overview of new
>>>> entity
>>>> 4. Wicket request cycle completes (I'm assuming this is where wicket
>>>> does
>>>> the response.redirect())
>>>> 5. Redirect is sent to browser
>>>> 6. Browser requests new page, which fails as backing entity hasn't been
>>>> persisted yet
>>>> 7. Transaction is commited, and new entity is persisted
>>>>
>>>> This is obviously a race condition between 6 and 7 (i.e. if 6 and 7 are
>>>> reversed, everything is OK).
>>>>
>>>> Now, I'm aware that this isn't a wicket-specific issue, but the way
>>>> wicket
>>>> works as a framework means that this situation is much more likely than
>>>> in a
>>>> model 2 style framework.
>>>>
>>>> Is transaction per-request using filters a reasonable configuration to
>>>> use
>>>> with wicket and, if so, how can I ensure that any redirects occur after
>>>> my
>>>> transaction has been committed?
>>>>
>>>> (My guess is to use onBeginRequest and onEndRequest, but that assumes
>>>> that
>>>> onEndRequest happens before redirection)
>>>>
>>>>
>>>> iainr
>>>>
>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>>>> For additional commands, e-mail: users-h...@wicket.apache.org
>>>>
>>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>>> For additional commands, e-mail: users-h...@wicket.apache.org
>>>
>>>
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
>> For additional commands, e-mail: users-h...@wicket.apache.org
>>
>>
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

Reply via email to