Hi,
I have solved the problem, overriding valueUnbound in my custom session and
updating the database
with my @SpringBeans works when the session is expiring. My problem was
that I was using data
from my session in the @Repository Dao impl class like this:
MyCustomSession.get() and that issued the "There is no application attached
to current thread ContainerBackgroundProcessor" exception.
Many thanks for the help.
Best regards
Daniela


2014-03-14 14:51 GMT+01:00 Daniela L <danigal...@gmail.com>:

> Hi Martin,
> it is definitely a problem in my code :-))
> But unfortunately I do not understand how to update the database at that
> stage using
> @SpringBean? Is that impossible? Do I have to do this outside Wicket using
> a HttpSessionListener?
> I also tryid to make my custom session implement
> HttpSessionBindingListener and override valueUnbound
> but that makes no difference. Is there a example for this anywhere, that
> seems to be such a common use case?
> Best Regards
> Daniela
>
>
> 2014-03-13 15:40 GMT+01:00 Martin Grigorov <mgrigo...@apache.org>:
>
> Hi,
>>
>> Maybe it is a problem in your code ;-)
>>
>>  <p>In case of session expiration this method is called in a non-worker
>> thread, i.e.
>>  * there are no thread locals exported for the Application, RequestCycle
>> and Session.
>>  * The Session is the current instance. The Application can be found by
>> using
>>  * {@link Application#get(String)}. There is no way to get a reference to
>> a
>> RequestCycle</p>
>>  */
>> public void onInvalidate()
>> {
>> }
>>
>> The javadoc clearly says that when this method is called by the web
>> container due to session expiration there are no thread locals.
>> The thread locals are available in #onInvalidate() only if the application
>> code called Session#invalidate[Now]() explicitly.
>>
>> Martin Grigorov
>> Wicket Training and Consulting
>>
>>
>> On Thu, Mar 13, 2014 at 4:34 PM, Daniela L <danigal...@gmail.com> wrote:
>>
>> > Hi Martin,
>> > if found the reason why the data is not freed in onInvalidate,
>> > the Spring/Hibernate update to the database issues a "There is no
>> > application attached to current thread
>> > ContainerBackgroundProcessor[StandardEngine[Catalina]]". Is this a
>> wicket
>> > or a tomcat issue?
>> > Best Regards
>> > Daniela
>> >
>> >
>> > 2014-03-12 14:31 GMT+01:00 Martin Grigorov <mgrigo...@apache.org>:
>> >
>> > > On Wed, Mar 12, 2014 at 3:20 PM, Daniela L <danigal...@gmail.com>
>> wrote:
>> > >
>> > > > Hi Martin,
>> > > > thank you very much for your quick and brilliant answer :-)
>> > > > Changing to AjaxCheckBox did the trick.
>> > > > It seems to be very difficult to provide a secure way to invalidate
>> > user
>> > > > data
>> > > > cross browser compliant. I noticed that using a tablet with android
>> or
>> > > IOS
>> > > > the
>> > > > beforeunload is not triggered at all. Therefor I added a cleanup
>> method
>> > > to
>> > > > the onInvalidate
>> > > > of my custom session which should be triggered by the tomcats
>> > > > session-timeout, but
>> > > > it seems using mobile devices onInvalidate is not triggered?
>> > > >
>> > >
>> > > onInvalidate() is called by the server when the client hasn't
>> > touched/used
>> > > its http session for session-timeout minutes.
>> > > It shouldn't matter whether it is a desktop or mobile client.
>> > >
>> > >
>> > > > Best Regards
>> > > > Daniela
>> > > >
>> > > >
>> > > > 2014-03-12 13:21 GMT+01:00 Martin Grigorov <mgrigo...@apache.org>:
>> > > >
>> > > > > Hi,
>> > > > >
>> > > > > On Wed, Mar 12, 2014 at 1:15 PM, Daniela L <danigal...@gmail.com>
>> > > wrote:
>> > > > >
>> > > > > > Hi,
>> > > > > > I am using a close browser behavior to clean up user data if the
>> > user
>> > > > > > closes
>> > > > > > the browser window. I also use a CheckBox to toggle the
>> visibility
>> > of
>> > > > > some
>> > > > > > Textfields. Unfortunately the refresh through the click of the
>> > > CheckBox
>> > > > > > triggers the close browser
>> > > > > > behavior. How can this be avoided?
>> > > > > > Here is what I did (with wicket 6.12.0):
>> > > > > >
>> > > > > >
>> > > > > > customerFirstName = new
>> > > > RequiredTextField<String>("customer.firstName");
>> > > > > > customerFirstName.setOutputMarkupPlaceholderTag(true);
>> > > > > > closeBrowserBehavior =  new AbstractDefaultAjaxBehavior() {
>> > > > > >            @Override
>> > > > > >             protected void respond(AjaxRequestTarget target) {
>> > > > > >
>> > > > > > AppointmentSession.get().releaseSavedBlockedFreeCalendarEvent();
>> > > > > >             }
>> > > > > >
>> > > > > >             @Override
>> > > > > >             public void renderHead(Component component,
>> > > IHeaderResponse
>> > > > > >                     response) {
>> > > > > >                 super.renderHead(component, response);
>> > > > > >                 response.render(new
>> > > > > >
>> > OnDomReadyHeaderItem("window.onbeforeunload =
>> > > > > > function (e) {"
>> > > > > >                                 + "if (!window.dontAsk) {"
>> > > > > >                                 + "Wicket.Ajax.get({u:
>> > > > > > '"+getCallbackUrl()+"', async: false});"
>> > > > > >                                 + "var message = 'my message.',"
>> > > > > >                                 + "e = e || window.event;" + "if
>> > (e)
>> > > {"
>> > > > > >                                 + "e.returnValue = message;" +
>> > "}}" +
>> > > > > > "return message;"
>> > > > > >                                 +
>> > > > > >                                 "};"));
>> > > > > >             }
>> > > > > >         };
>> > > > > > customerFirstName.add(closeBrowserBehavior);
>> > > > > > form.add(customerFirstName);
>> > > > > >
>> > > > > > createAccountCB = new CheckBox("createAccountCB", new
>> > > > > > Model<Boolean>(createAccount)){
>> > > > > >             @Override
>> > > > > >             protected void onSelectionChanged(Boolean
>> > newSelection) {
>> > > > > >                 super.onSelectionChanged(newSelection);
>> > > > > >                 createAccount = !createAccount;
>> > > > > >             }
>> > > > > >
>> > > > > >             @Override
>> > > > > >             protected boolean
>> wantOnSelectionChangedNotifications()
>> > > > > >             {
>> > > > > >                 return true;
>> > > > > >
>> > > > >
>> > > > > This uses non-Ajax way to submit the new selection.
>> > > > > As you noted this leads to 'beforeunload' event being fired.
>> > > > >
>> > > > > You will have to use AjaxCheckBox or
>> > AjaxFormComponentUpdatingBehavior
>> > > to
>> > > > > avoid the page reload.
>> > > > >
>> > > > >
>> > > > > >             }
>> > > > > >         };
>> > > > > > form.add(createAccountCB);
>> > > > > >
>> > > > > > emailRepeat = new TextField<String>("emailRepeat", new
>> > > > > > PropertyModel<String>(appointCalendar, customer.eMailAdress")){
>> > > > > >           @Override
>> > > > > >             protected void onConfigure(){
>> > > > > >                 super.onConfigure();
>> > > > > >                 setVisibilityAllowed(createAccount);
>> > > > > >             }
>> > > > > >             }
>> > > > > >         };
>> > > > > > emailRepeat.setOutputMarkupPlaceholderTag(true);
>> > > > > > form.add(emailRepeat):
>> > > > > >
>> > > > > > Thanks a lot in advance!
>> > > > > > Best Regards
>> > > > > > Daniela
>> > > > > >
>> > > > >
>> > > >
>> > >
>> >
>>
>
>

Reply via email to