But the nice thing about Guice/Wicket is that you don't have to
concern yourself with the serialization problem. And for my non-page
components, injection works perfectly. (This is because Guice injects
a *serializable* proxy not an actual instance of the service itself.
On detach/serialization, the proxy is serialized and on
deserializaiton/rehydration, Guice/Wicket will inject the
proxy/service again.)

So, to reiterate, my problem is that all of this works perfectly for
me for any non-page components, but when I @Inject on a Page, the
service that is injected is not a proxy and therefore not
serializable... and therefore I get the serialization exceptions.

Technically Guice IS injecting my service at the page level, it's just
injecting the instance itself and not wrapping it a proxy, whereas it
IS injecting serializable proxies for non-page components. Why?


On Thu, Jun 25, 2009 at 2:04 PM, Mauro Ciancio<[email protected]> wrote:
> On Wed, Jun 24, 2009 at 1:38 PM, Aaron Dixon <[email protected]> wrote:
>
>>
>> org.apache.wicket.util.io.SerializableChecker$WicketNotSerializableException:
>> Unable to serialize class:
>> com.mycompany.dao.MyDao$$EnhancerByGuice$$3e6e9f94
>> Field hierarchy is:
>>  2 [class=com.mycompany.pages.MyPage, path=2]
>>    private com.mycompany.dao.MyDao
>>
>> com.mycompany.pages.MyPage.myDao[class=com.mycompany.dao.MyDao$$EnhancerByGuice$$3e6e9f94]
>> <----- field that is not serializable
>>    at
>>
>> org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:342)
>>    at
>>
>> org.apache.wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:610)
>> ...
>> ====
>>
>> Has anyone else noticed this?
>>
>
>  Yes, it happens because the injected class isn't Serializable and when
> your page
> is serialized the exception is thrown.
>  You could use for example a
> LoadableDetachableModel<http://wicket.apache.org/docs/wicket-1.3.2/wicket/apidocs/org/apache/wicket/model/LoadableDetachableModel.html>to
> detach your DAO when
> your page is serialized.
>  Guice also comes with an interface named Provider<T>. This could helps
> because it
> dont hold a reference to your un-serializable object.
>
> Example:
>
> class MyPage extends Page {
>  LoadableDetachableModel daoModel = new loadable() {
>    object get() {
>          return new dao();
>     }
>  };
>
>  void something() {
>     mydao = daoModel.getObject();
>     //stuff
>  }
>
>  void ondetach() {
>    super.ondetach()
>     daomodel.detach();
>   }
>  }
>
> HTH
> Cheers!
> --
> Mauro Ciancio
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to