Hi Sven,

Thank you for your reply.

On catching failure “when it happens”: can you explain what that looks like
for you?

E.g. do you handle exceptions within the model itself, or with a
RequestCycleListener?

I think the tricky part is handling exceptions thrown by models, unless I
guard every call to “getModelObject()” inside my components with a
try-catch (so in methods like onConfigure, onClick etc).

Met vriendelijke groet,
Kind regards,

Bas Gooren

Op 14 januari 2021 bij 19:18:57, Sven Meier (s...@meiers.net) schreef:

Hi Bas,

in my experience is is very hard to check every possible failure upfront
in preconditions (whether from page or models). There's always a
corner-case waiting to hunt you.

Therefore I prefer using option 1: catch the failure when it happens.
Worked fine for me (most of the time), but maybe not a suitable approach
for all kind of applications.

Regards
Sven



On 12.01.21 14:37, Bas Gooren wrote:
> Hi all,
>
> First off: best wishes to everyone for 2021, and that we may all have fun
> this year building stuff in Wicket!
>
> I’m wondering how others implement the following requirement…
>
> Suppose a page has a model backed by something stored in the session or
> database (e.g. an e-commerce basket page or checkout).
> When the user opens multiple tabs (with different instances of the page),
> either page can become “outdated” with regards to the actual data.
>
> E.g. in Tab A the customer removes a product.
>
> When the users then tries to update the quantity of that product in Tab
B,
> it can lead to a variety of runtime exceptions:
> For example: Basket items are rendered with a repeater; If the # items in
> the basket changes, rows may reference non-existant items (either by
> database ID or by list index in the basket rows).
>
> This sort of problem appears in various shapes and forms when a page
> references data that may change independent from the page itself.
>
> Over the years I have attempted to fix this in three ways:
>
> 1. Catch RTEs/Exceptions and re-render page (works OK); But suppose a
> ListView is used, this also needs to handle things like
> IndexOutOfBoundsException (thrown from inside ListItemModel) /
> EntityNotFoundException / NullPointerException. Feels cluttered and
> “cleaning up after the fact” instead of preventing the RTE in the first
> place.
> 2. Check preconditions in page’s onConfigure(). Mixed results,
> preconditions not always checked before action is executed (e.g. ajax
link
> click, form submit). So leads to finding more spots to check for
> preconditions, e.g. Form#process
> 3. Wrap models with decorating models at the page level that check
> preconditions; E.g. BasketNotEmptyModel; Usually combined with
specialized
> subclass of Form which manages transaction and commit/rollback
>
> Of all these ways I prefer option 3 nowadays, as this is a close to the
> “root” of the problem as possible: at the point where the data is
accessed.
> Since such models are always caching models (LDM), the overhead is
minimal
> (called once or twice per request).
> Another advantage is that all components in the page point to the parent
> model, which means preconditions are always checked for any component on
> the page.
>
> When using JPA we can even do a simple check for the entity “last
modified”
> or version, to ensure that the entity did not change between requests.
>
> However, I’m evaluating which variant I will use from now on in projects
> (to standardize) and am wondering how others handle this.
>
> Any input/feedback is highly appreciated!
>
> Kind regards,
>
> Bas
>

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

Reply via email to