Re: Injecting DB service results in IllegalStateException: EntityManager is closed

2013-06-28 Thread Andreas Lundblad
On Thu, Jun 27, 2013 at 11:27 PM, Bas Gooren b...@iswd.nl wrote:
 PS See https://code.google.com/p/google-guice/wiki/InjectingProviders
 (header Providers for Mixing Scopes).


 Met vriendelijke groet,
 Kind regards,

 Bas Gooren


A (possibly stupid) follow-up question.

To try out the idea that you proposed with a Provider, I changed

@Inject
IService service;
...
service.xyz()

to

@Inject
ProviderIService service;
...
service.get().xyz()


But I still get the same EntityManager is closed error. (I also
tried changing from EntityManager to ProviderEntityManager in the
JpaService. Same error.)

Is this the correct way of using Guice Providers in Wicket? If no,
where can I find examples/documentation on how to use Providers in
Wicket? If yes, the EntityManager is closed error seems to be due to
something else.

best regards,
Andreas Lundblad

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



Re: Injecting DB service results in IllegalStateException: EntityManager is closed

2013-06-28 Thread Bas Gooren

Hi Andreas,

When I debugged your code yesterday, I changed the injection in 
JpaService to ProviderEntityManager, and the error was gone. See 
http://pastebin.com/6NwjcVt4


Please ensure that your Jetty instance is actually using the updated code;

Met vriendelijke groet,
Kind regards,

Bas Gooren

Op 28-6-2013 10:04, schreef Andreas Lundblad:

On Thu, Jun 27, 2013 at 11:27 PM, Bas Gooren b...@iswd.nl wrote:

PS See https://code.google.com/p/google-guice/wiki/InjectingProviders
(header Providers for Mixing Scopes).


Met vriendelijke groet,
Kind regards,

Bas Gooren


A (possibly stupid) follow-up question.

To try out the idea that you proposed with a Provider, I changed

 @Inject
 IService service;
 ...
 service.xyz()

to

 @Inject
 ProviderIService service;
 ...
 service.get().xyz()


But I still get the same EntityManager is closed error. (I also
tried changing from EntityManager to ProviderEntityManager in the
JpaService. Same error.)

Is this the correct way of using Guice Providers in Wicket? If no,
where can I find examples/documentation on how to use Providers in
Wicket? If yes, the EntityManager is closed error seems to be due to
something else.

best regards,
Andreas Lundblad

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





Re: Injecting DB service results in IllegalStateException: EntityManager is closed

2013-06-28 Thread Martin Grigorov
Hi,


On Fri, Jun 28, 2013 at 12:43 AM, Bas Gooren b...@iswd.nl wrote:

 Hi Andreas,

 My guess is that the GuiceComponentInjector proxies are detached when
 the page is serialized.
 The last page (or the last N pages) are kept in memory by wicket (I think,
 last I checked was some years ago).

 Checking ...
 Yes, see LazyInitProxyFactory and its nested class JdkJHandler (which is
 used for injected interfaces).
 The proxy is replaced on serialization.

 Somehow I always thought the proxies were also detached when the page is
 detach()-ed. Guess not :-)


This explains it!
The last used page instance is stored in the HttpSession, and this keeps a
reference to a proxy with a closed EntityManager.

Wicket detaches all components and their default models, but there is no
logic to null-ify the transient field in JdkHandler -
https://github.com/apache/wicket/blob/master/wicket-ioc/src/main/java/org/apache/wicket/proxy/LazyInitProxyFactory.java?source=c#L375

The simplest solution is to not keep the 'target' as a field at all. Just
as the IProxyTargetLocator for the service at every usage. Will this be
slow ?!



 Met vriendelijke groet,
 Kind regards,

 Bas Gooren

 Op 27-6-2013 23:37, schreef Andreas Lundblad:

  On Thu, Jun 27, 2013 at 11:25 PM, Bas Gooren b...@iswd.nl wrote:

 Hi Andreas,

 When your validator fails, you remain on the FormPage. A quick debug
 session
 shows me that the injected IService remains the same accross requests.

 I've seen this too. I thought that this didn't matter since, as you
 said: The GuiceComponentInjector which is set-up in the wicket
 application injects proxies.

  The fix for your problem is simple, and a best practice anyway: inject
 ProviderEntityManager in your service.

 It's a best practice since the service does not know the scope of the
 entitymanager, all it knows is that the entitymanager has a different
 lifecycle; Your service may be instantiated and kept around for the time
 your app is running, but could also be instantiated on the fly when
 needed.
 That's one of the reasons why Provider was invented: if the scope is
 different, a provider allows you to nicely deal with it.

 In case you are not familiar with providers: it has no negative
 side-effects
 in terms of performance.
 The guice-persist module binds the EntityManager per request, so all
 calls
 to ProviderEntityManager while in the same request will yield the exact
 same EntityManager instance.



 PS See https://code.google.com/p/**google-guice/wiki/**
 InjectingProvidershttps://code.google.com/p/google-guice/wiki/InjectingProviders(header
  Providers for Mixing Scopes).

 Thank you Bas for this excellent answer. Much appreciated.

 -- Andreas Lundblad

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





Re: Injecting DB service results in IllegalStateException: EntityManager is closed

2013-06-28 Thread Martin Grigorov
On Fri, Jun 28, 2013 at 11:15 AM, Martin Grigorov mgrigo...@apache.orgwrote:

 Hi,


 On Fri, Jun 28, 2013 at 12:43 AM, Bas Gooren b...@iswd.nl wrote:

 Hi Andreas,

 My guess is that the GuiceComponentInjector proxies are detached when
 the page is serialized.
 The last page (or the last N pages) are kept in memory by wicket (I
 think, last I checked was some years ago).

 Checking ...
 Yes, see LazyInitProxyFactory and its nested class JdkJHandler (which is
 used for injected interfaces).
 The proxy is replaced on serialization.

 Somehow I always thought the proxies were also detached when the page is
 detach()-ed. Guess not :-)


 This explains it!
 The last used page instance is stored in the HttpSession, and this keeps a
 reference to a proxy with a closed EntityManager.

 Wicket detaches all components and their default models, but there is no
 logic to null-ify the transient field in JdkHandler -
 https://github.com/apache/wicket/blob/master/wicket-ioc/src/main/java/org/apache/wicket/proxy/LazyInitProxyFactory.java?source=c#L375

 The simplest solution is to not keep the 'target' as a field at all. Just
 as the IProxyTargetLocator for the service at every usage. Will this be
 slow ?!


This should read:  Just ask ...





 Met vriendelijke groet,
 Kind regards,

 Bas Gooren

 Op 27-6-2013 23:37, schreef Andreas Lundblad:

  On Thu, Jun 27, 2013 at 11:25 PM, Bas Gooren b...@iswd.nl wrote:

 Hi Andreas,

 When your validator fails, you remain on the FormPage. A quick debug
 session
 shows me that the injected IService remains the same accross requests.

 I've seen this too. I thought that this didn't matter since, as you
 said: The GuiceComponentInjector which is set-up in the wicket
 application injects proxies.

  The fix for your problem is simple, and a best practice anyway: inject
 ProviderEntityManager in your service.

 It's a best practice since the service does not know the scope of the
 entitymanager, all it knows is that the entitymanager has a different
 lifecycle; Your service may be instantiated and kept around for the time
 your app is running, but could also be instantiated on the fly when
 needed.
 That's one of the reasons why Provider was invented: if the scope is
 different, a provider allows you to nicely deal with it.

 In case you are not familiar with providers: it has no negative
 side-effects
 in terms of performance.
 The guice-persist module binds the EntityManager per request, so all
 calls
 to ProviderEntityManager while in the same request will yield the
 exact
 same EntityManager instance.



 PS See https://code.google.com/p/**google-guice/wiki/**
 InjectingProvidershttps://code.google.com/p/google-guice/wiki/InjectingProviders(header
  Providers for Mixing Scopes).

 Thank you Bas for this excellent answer. Much appreciated.

 -- Andreas Lundblad

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






Re: Injecting DB service results in IllegalStateException: EntityManager is closed

2013-06-27 Thread Bas Gooren

Hi,

Looking at the github project you refer to, it should work.
The GuiceComponentInjector which is set-up in the wicket application 
injects proxies. That means that when your form is submitted (and a 
second request is made), a new service instance is created.


So if it's not working for you, there is probably another problem with 
your code.
Can you show us some relevant parts of your code, e.g. the validator and 
the page which contains the validator?


Met vriendelijke groet,
Kind regards,

Bas Gooren

Op 26-6-2013 22:32, schreef Andreas Lundblad:

I've just started using Wicket (I'm half way through Wicket in Action).

I've run into the following problem with a user registration form: In
order to make sure that the provided e-mail is not already registered
I've written a UniqueEmailValidator which I attach to the email
field. This validator needs access to the DB-service to query the
database for already registered email-adresses.

The problem is that the DB-service is injected when the registration
page is created and since I'm using open-session-in-view, the
DB-service EntityManager is closed after the page is rendered. This
causes an

   IllegalStateException: EntityManager is closed

once the form is submitted in a subsequent request. (Since the same
old DB-service object is used in the second request.)


(I had the same problem when trying to inject the DB-service in the
session-object. The same DB-service object was used in multiple
requests causing the IllegalStateException.)


I figured this must be a fairly common problem but can't for my life
find any solutions in the archives or through googling. I'm curious
what the best practice is to solve this.


(My project builds upon the code available here:
http://github.com/javadev/wicket-guice-demo )


best regards, Andreas Lundblad

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





Re: Injecting DB service results in IllegalStateException: EntityManager is closed

2013-06-27 Thread Bas Gooren
I agree; Since the EntityManager is bound to the request (scope), it's 
usually better to inject ProviderEntityManager


However, in the demo project the service is not a singleton, so it 
should be fine. A new instance of the service is created for every 
injection.


Met vriendelijke groet,
Kind regards,

Bas Gooren

Op 27-6-2013 9:10, schreef Martin Grigorov:

Hi,

I'm not sure whether this is the best solution but you can inject a
Provider:

@Inject
private ProviderEntityManager em;

...

em.get().find(...);


On Thu, Jun 27, 2013 at 9:36 AM, Bas Gooren b...@iswd.nl wrote:


Hi,

Looking at the github project you refer to, it should work.
The GuiceComponentInjector which is set-up in the wicket application
injects proxies. That means that when your form is submitted (and a second
request is made), a new service instance is created.

So if it's not working for you, there is probably another problem with
your code.
Can you show us some relevant parts of your code, e.g. the validator and
the page which contains the validator?

Met vriendelijke groet,
Kind regards,

Bas Gooren

Op 26-6-2013 22:32, schreef Andreas Lundblad:

  I've just started using Wicket (I'm half way through Wicket in Action).

I've run into the following problem with a user registration form: In
order to make sure that the provided e-mail is not already registered
I've written a UniqueEmailValidator which I attach to the email
field. This validator needs access to the DB-service to query the
database for already registered email-adresses.

The problem is that the DB-service is injected when the registration
page is created and since I'm using open-session-in-view, the
DB-service EntityManager is closed after the page is rendered. This
causes an

IllegalStateException: EntityManager is closed

once the form is submitted in a subsequent request. (Since the same
old DB-service object is used in the second request.)


(I had the same problem when trying to inject the DB-service in the
session-object. The same DB-service object was used in multiple
requests causing the IllegalStateException.)


I figured this must be a fairly common problem but can't for my life
find any solutions in the archives or through googling. I'm curious
what the best practice is to solve this.


(My project builds upon the code available here:
http://github.com/javadev/**wicket-guice-demohttp://github.com/javadev/wicket-guice-demo)


best regards, Andreas Lundblad

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






Re: Injecting DB service results in IllegalStateException: EntityManager is closed

2013-06-27 Thread Martin Grigorov
Here are some discussions:
http://stackoverflow.com/questions/10431640/guice-persist-attempting-to-execute-an-operation-on-a-closed-entitymanager
http://stackoverflow.com/questions/14585505/jpa-guice-persist-permanently-opened-connection-issue


On Thu, Jun 27, 2013 at 3:20 PM, Bas Gooren b...@iswd.nl wrote:

 I agree; Since the EntityManager is bound to the request (scope), it's
 usually better to inject ProviderEntityManager

 However, in the demo project the service is not a singleton, so it should
 be fine. A new instance of the service is created for every injection.


 Met vriendelijke groet,
 Kind regards,

 Bas Gooren

 Op 27-6-2013 9:10, schreef Martin Grigorov:

 Hi,

 I'm not sure whether this is the best solution but you can inject a
 Provider:

 @Inject
 private ProviderEntityManager em;

 ...

 em.get().find(...);


 On Thu, Jun 27, 2013 at 9:36 AM, Bas Gooren b...@iswd.nl wrote:

  Hi,

 Looking at the github project you refer to, it should work.
 The GuiceComponentInjector which is set-up in the wicket application
 injects proxies. That means that when your form is submitted (and a
 second
 request is made), a new service instance is created.

 So if it's not working for you, there is probably another problem with
 your code.
 Can you show us some relevant parts of your code, e.g. the validator and
 the page which contains the validator?

 Met vriendelijke groet,
 Kind regards,

 Bas Gooren

 Op 26-6-2013 22:32, schreef Andreas Lundblad:

   I've just started using Wicket (I'm half way through Wicket in Action).

 I've run into the following problem with a user registration form: In
 order to make sure that the provided e-mail is not already registered
 I've written a UniqueEmailValidator which I attach to the email
 field. This validator needs access to the DB-service to query the
 database for already registered email-adresses.

 The problem is that the DB-service is injected when the registration
 page is created and since I'm using open-session-in-view, the
 DB-service EntityManager is closed after the page is rendered. This
 causes an

 IllegalStateException: EntityManager is closed

 once the form is submitted in a subsequent request. (Since the same
 old DB-service object is used in the second request.)


 (I had the same problem when trying to inject the DB-service in the
 session-object. The same DB-service object was used in multiple
 requests causing the IllegalStateException.)


 I figured this must be a fairly common problem but can't for my life
 find any solutions in the archives or through googling. I'm curious
 what the best practice is to solve this.


 (My project builds upon the code available here:
 http://github.com/javadev/wicket-guice-demohttp://github.com/javadev/**wicket-guice-demo
 http://**github.com/javadev/wicket-**guice-demohttp://github.com/javadev/wicket-guice-demo
 )


 best regards, Andreas Lundblad

 --**
 --**-
 To unsubscribe, e-mail: 
 users-unsubscribe@wicket.**apa**che.orghttp://apache.org
 users-unsubscribe@**wicket.apache.orgusers-unsubscr...@wicket.apache.org
 

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






Re: Injecting DB service results in IllegalStateException: EntityManager is closed

2013-06-27 Thread Bas Gooren

I'm not the one who posed the original question.

Andreas, like I said: please show us some code, and we can help you 
pinpoint your issue.
In case your service is being serialized, a quick fix is to inject a 
ProviderEntityManager instead of an EntityManager.


Met vriendelijke groet,
Kind regards,

Bas Gooren

Op 27-6-2013 14:25, schreef Martin Grigorov:

Here are some discussions:
http://stackoverflow.com/questions/10431640/guice-persist-attempting-to-execute-an-operation-on-a-closed-entitymanager
http://stackoverflow.com/questions/14585505/jpa-guice-persist-permanently-opened-connection-issue


On Thu, Jun 27, 2013 at 3:20 PM, Bas Gooren b...@iswd.nl wrote:


I agree; Since the EntityManager is bound to the request (scope), it's
usually better to inject ProviderEntityManager

However, in the demo project the service is not a singleton, so it should
be fine. A new instance of the service is created for every injection.


Met vriendelijke groet,
Kind regards,

Bas Gooren

Op 27-6-2013 9:10, schreef Martin Grigorov:


Hi,

I'm not sure whether this is the best solution but you can inject a
Provider:

@Inject
private ProviderEntityManager em;

...

em.get().find(...);


On Thu, Jun 27, 2013 at 9:36 AM, Bas Gooren b...@iswd.nl wrote:

  Hi,

Looking at the github project you refer to, it should work.
The GuiceComponentInjector which is set-up in the wicket application
injects proxies. That means that when your form is submitted (and a
second
request is made), a new service instance is created.

So if it's not working for you, there is probably another problem with
your code.
Can you show us some relevant parts of your code, e.g. the validator and
the page which contains the validator?

Met vriendelijke groet,
Kind regards,

Bas Gooren

Op 26-6-2013 22:32, schreef Andreas Lundblad:

   I've just started using Wicket (I'm half way through Wicket in Action).


I've run into the following problem with a user registration form: In
order to make sure that the provided e-mail is not already registered
I've written a UniqueEmailValidator which I attach to the email
field. This validator needs access to the DB-service to query the
database for already registered email-adresses.

The problem is that the DB-service is injected when the registration
page is created and since I'm using open-session-in-view, the
DB-service EntityManager is closed after the page is rendered. This
causes an

 IllegalStateException: EntityManager is closed

once the form is submitted in a subsequent request. (Since the same
old DB-service object is used in the second request.)


(I had the same problem when trying to inject the DB-service in the
session-object. The same DB-service object was used in multiple
requests causing the IllegalStateException.)


I figured this must be a fairly common problem but can't for my life
find any solutions in the archives or through googling. I'm curious
what the best practice is to solve this.


(My project builds upon the code available here:
http://github.com/javadev/wicket-guice-demohttp://github.com/javadev/**wicket-guice-demo
http://**github.com/javadev/wicket-**guice-demohttp://github.com/javadev/wicket-guice-demo

)


best regards, Andreas Lundblad

--**
--**-
To unsubscribe, e-mail: 
users-unsubscribe@wicket.**apa**che.orghttp://apache.org
users-unsubscribe@**wicket.apache.orgusers-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org







Re: Injecting DB service results in IllegalStateException: EntityManager is closed

2013-06-27 Thread Andreas Lundblad
On Thu, Jun 27, 2013 at 3:59 PM, Bas Gooren b...@iswd.nl wrote:
 I'm not the one who posed the original question.

 Andreas, like I said: please show us some code, and we can help you pinpoint
 your issue.


Thanks for all the rapid help!

I've created a minimal page that shows the error. Basically no
difference from the original code (
http://github.com/javadev/wicket-guice-demo )

To reproduce:

1. Download and unzip http://aoeu.se/www/wicketguice-problem.zip
2. mvn jetty:run
3. Go to localhost:9090, then go to Form page
4. Try to submit gavin
5. Try to submit gavin again.

This results in the 'EntityManager is closed' exception. No idea how
to solve this. If it's unsolvable, I'll look into the Provider
approach, but it would be really nice to manage without it.

best regards,
Andreas Lundblad

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



Re: Injecting DB service results in IllegalStateException: EntityManager is closed

2013-06-27 Thread Bas Gooren

Hi Andreas,

When your validator fails, you remain on the FormPage. A quick debug 
session shows me that the injected IService remains the same accross 
requests.
The fix for your problem is simple, and a best practice anyway: inject 
ProviderEntityManager in your service.


It's a best practice since the service does not know the scope of the 
entitymanager, all it knows is that the entitymanager has a different 
lifecycle; Your service may be instantiated and kept around for the time 
your app is running, but could also be instantiated on the fly when needed.
That's one of the reasons why Provider was invented: if the scope is 
different, a provider allows you to nicely deal with it.


In case you are not familiar with providers: it has no negative 
side-effects in terms of performance.
The guice-persist module binds the EntityManager per request, so all 
calls to ProviderEntityManager while in the same request will yield 
the exact same EntityManager instance.


Met vriendelijke groet,
Kind regards,

Bas Gooren

Op 27-6-2013 22:03, schreef Andreas Lundblad:

On Thu, Jun 27, 2013 at 3:59 PM, Bas Gooren b...@iswd.nl wrote:

I'm not the one who posed the original question.

Andreas, like I said: please show us some code, and we can help you pinpoint
your issue.


Thanks for all the rapid help!

I've created a minimal page that shows the error. Basically no
difference from the original code (
http://github.com/javadev/wicket-guice-demo )

To reproduce:

1. Download and unzip http://aoeu.se/www/wicketguice-problem.zip
2. mvn jetty:run
3. Go to localhost:9090, then go to Form page
4. Try to submit gavin
5. Try to submit gavin again.

This results in the 'EntityManager is closed' exception. No idea how
to solve this. If it's unsolvable, I'll look into the Provider
approach, but it would be really nice to manage without it.

best regards,
Andreas Lundblad

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





Re: Injecting DB service results in IllegalStateException: EntityManager is closed

2013-06-27 Thread Andreas Lundblad
On Thu, Jun 27, 2013 at 11:25 PM, Bas Gooren b...@iswd.nl wrote:
 Hi Andreas,

 When your validator fails, you remain on the FormPage. A quick debug session
 shows me that the injected IService remains the same accross requests.

I've seen this too. I thought that this didn't matter since, as you
said: The GuiceComponentInjector which is set-up in the wicket
application injects proxies.

 The fix for your problem is simple, and a best practice anyway: inject
 ProviderEntityManager in your service.

 It's a best practice since the service does not know the scope of the
 entitymanager, all it knows is that the entitymanager has a different
 lifecycle; Your service may be instantiated and kept around for the time
 your app is running, but could also be instantiated on the fly when needed.
 That's one of the reasons why Provider was invented: if the scope is
 different, a provider allows you to nicely deal with it.

 In case you are not familiar with providers: it has no negative side-effects
 in terms of performance.
 The guice-persist module binds the EntityManager per request, so all calls
 to ProviderEntityManager while in the same request will yield the exact
 same EntityManager instance.



 PS See https://code.google.com/p/google-guice/wiki/InjectingProviders (header 
 Providers for Mixing Scopes).

Thank you Bas for this excellent answer. Much appreciated.

-- Andreas Lundblad

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



Re: Injecting DB service results in IllegalStateException: EntityManager is closed

2013-06-27 Thread Bas Gooren
PS See https://code.google.com/p/google-guice/wiki/InjectingProviders 
(header Providers for Mixing Scopes).


Met vriendelijke groet,
Kind regards,

Bas Gooren

Op 27-6-2013 22:03, schreef Andreas Lundblad:

On Thu, Jun 27, 2013 at 3:59 PM, Bas Gooren b...@iswd.nl wrote:

I'm not the one who posed the original question.

Andreas, like I said: please show us some code, and we can help you pinpoint
your issue.


Thanks for all the rapid help!

I've created a minimal page that shows the error. Basically no
difference from the original code (
http://github.com/javadev/wicket-guice-demo )

To reproduce:

1. Download and unzip http://aoeu.se/www/wicketguice-problem.zip
2. mvn jetty:run
3. Go to localhost:9090, then go to Form page
4. Try to submit gavin
5. Try to submit gavin again.

This results in the 'EntityManager is closed' exception. No idea how
to solve this. If it's unsolvable, I'll look into the Provider
approach, but it would be really nice to manage without it.

best regards,
Andreas Lundblad

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





Re: Injecting DB service results in IllegalStateException: EntityManager is closed

2013-06-27 Thread Bas Gooren

Hi Andreas,

My guess is that the GuiceComponentInjector proxies are detached when 
the page is serialized.
The last page (or the last N pages) are kept in memory by wicket (I 
think, last I checked was some years ago).


Checking ...
Yes, see LazyInitProxyFactory and its nested class JdkJHandler (which is 
used for injected interfaces).

The proxy is replaced on serialization.

Somehow I always thought the proxies were also detached when the page is 
detach()-ed. Guess not :-)


Met vriendelijke groet,
Kind regards,

Bas Gooren

Op 27-6-2013 23:37, schreef Andreas Lundblad:

On Thu, Jun 27, 2013 at 11:25 PM, Bas Gooren b...@iswd.nl wrote:

Hi Andreas,

When your validator fails, you remain on the FormPage. A quick debug session
shows me that the injected IService remains the same accross requests.

I've seen this too. I thought that this didn't matter since, as you
said: The GuiceComponentInjector which is set-up in the wicket
application injects proxies.


The fix for your problem is simple, and a best practice anyway: inject
ProviderEntityManager in your service.

It's a best practice since the service does not know the scope of the
entitymanager, all it knows is that the entitymanager has a different
lifecycle; Your service may be instantiated and kept around for the time
your app is running, but could also be instantiated on the fly when needed.
That's one of the reasons why Provider was invented: if the scope is
different, a provider allows you to nicely deal with it.

In case you are not familiar with providers: it has no negative side-effects
in terms of performance.
The guice-persist module binds the EntityManager per request, so all calls
to ProviderEntityManager while in the same request will yield the exact
same EntityManager instance.



PS See https://code.google.com/p/google-guice/wiki/InjectingProviders (header 
Providers for Mixing Scopes).

Thank you Bas for this excellent answer. Much appreciated.

-- Andreas Lundblad

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