On 03/27/2015 12:26 PM, Dan Haywood wrote:
Hi Erik,

On 25 March 2015 at 12:42, Erik de Hair <[email protected]> wrote:

Hi,

I have to call I web service from a view model but, when opening the view
model, the call to the web service is called twice. It doesn't matter if
the call is in de viewmodelinit or in some other method. May be there's
some way to track the state of the view model and let whether or not the
call is executed depend on that?

My guess is that you are seeing the view model called twice because we use
(Wicket's support for) the redirect-after-post pattern.

That is, when the action is invoked you are instantiating the view model
(which calls the webservice), and then we return a 302 redirect to the
browser so that it then re-requests the same URL, causing the view model to
be recreated (and that webservice called).

Perhaps you could confirm if that's what's happening?
The following is happening...

In the initial state the view model is rendered and the data that is needed to call the web service is already available from the view model memento. (This means that when refreshing the page the web service will be called again. This is not much of a problem.)

Now, when clicking** the action button that opens the action for re-entering the web service parameters, a request for the view model is done:

0:0:0:0:0:0:0:1 - - [01/Apr/2015:12:04:09 +0200] "GET /portal/wicket/entity/*nl.pocos.dom.access.availability.PostalCodeCheck:PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8-PGpzb24-eyJwb3N0YWxDb2RlIjoiNTYxNEFFIiwiaG91c2VOdW1iZXIiOiIxNTIifTwvanNvbj48L21lbWVudG8-?6-1.IBehaviorListener.0-theme-entity-entity~0-entityPropertiesAndCollections-entityProperties-leftColumn-memberGroup-1-properties-4-property-scalarIfRegular-additionalLinks-additionalLinkList-additionalLinkItem-0-additionalLink&_=1427882228283 HTTP/1.1" 200 12838 http-bio-8081-exec-4 2303

This way the web service is called again because the previous web service parameters are still available from the view model memento.

After submitting the following requests are handled:

0:0:0:0:0:0:0:1 - - [01/Apr/2015:12:06:17 +0200] "POST /portal/wicket/entity/*nl.pocos.dom.access.availability.PostalCodeCheck:PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8-PGpzb24-eyJwb3N0YWxDb2RlIjoiNTYxNEFFIiwiaG91c2VOdW1iZXIiOiIxNTIifTwvanNvbj48L21lbWVudG8-?6-1.IBehaviorListener.1-theme-actionPromptModalWindow-content-parameters-inputForm-okButton HTTP/1.1" 200 91 http-bio-8081-exec-6 169

(web service called two times during this request)

0:0:0:0:0:0:0:1 - - [01/Apr/2015:12:06:19 +0200] "GET /portal/wicket/wicket/page?7 HTTP/1.1" 200 167629 http-bio-8081-exec-6 2582

(web service called once during this request)

If it is, then one option might be to defer the fetching of the data until
as late as possible, ie when it needs to be constructed.
I tried this but the method that exposes the data to the gui will always call the method that fetches the data when constructing the view model. So no matter how late the data will be fetched, it will always be fetched.

Another option might be to have the view model use the HttpSession (via
isis-module-servletapi addon) to keep track of state.
I'm still using Isis 1.7.0 and Eclipse complains about the module missing some dependency. It does work however and I can prevent the web service from being called by checking for a request method of GET during the POST-request but there are still 3 calls left.

I didn't use the session object yet. Will try that.

HTH
Dan



The web service is fetching data, triggered by an action in the view
model, for the same view model. Do I always have to return a new view model
with the fetched data in it or can I use the data from the fetch method and
return the same view model?

Thanks,
Erik


Reply via email to