passing 0 instead of -1 is definitely not the solution. This can
result in wrong page version set to other page references. I wish you
could provide a quickstart that reproduces the problem. It looks like
a bug in wicket but so far I'm not able to reproduce this behavior.
-Matej
On Fri, Apr 4, 2008 at 9:01 PM, Daniel Wu <[EMAIL PROTECTED]> wrote:
> I think I've found the solution for my StreamCorruptedException problem.
> Inside the org.apache.wicket.Page, there is a constant LATEST_VERSION which
> value is -1. In my application, the versionNumber passed as parameter to
> the method getVersion(final int versionNumber) inside Page is never -1, the
> initial versionNumber of a page is always 0. When this versionNumber is
> different from 0, the versionManager object inside Page is not null, so the
> flow goes to the else block inside the getVersion() method.
>
> If LATEST_VERSION is -1, the flow of my application is always going to the
> if block below, never to else block, as my versionNumber is always >= 0, so
> depending on the versionNumber, no page will be recovered, which was leading
> to the StreamCorruptedException, maybe because wicket was trying to
> de-serialize the wrong version of my page.
>
> if (versionNumber != LATEST_VERSION) {
> page = versionManager.getVersion(versionNumber);
> }
> else {
> page = versionManager.getVersion(getCurrentVersionNumber());
> }
>
> I've changed LATEST_VERSION value to 0, and now my application works
> perfectly. Are these assumptions correct? Does anytime versionNumber assumes
> the -1 value?
>
>
>
> On Thu, Apr 3, 2008 at 8:43 PM, Daniel Wu <[EMAIL PROTECTED]> wrote:
>
> > I debugged my application and it really doesn't have a
> > ClassNotFoundException eaten by ObjectInputStream. I compared the flow of
> > two screens of my application, one that works and another that doesn't:
> >
> > 1) The line 298 of SecondLevelCacheSessionStore =>
> > getLastPage().getVersion(versionNumber) is returning the correct page,
> > because inside the getVersion() method, the versionManager object is null.
> > In this case, the screen that I'm testing works perfectly.
> >
> > 2) For the screen that throws the StackOverFlow and
> > StreamCorruptedException, for some reason the versionManager object is not
> > null, and it returns a null page object.
> >
> > Another strange thing is that after the line 393 of Objects.java => return
> > ois.readObject(); => while debugging it using Eclipse, after this method
> > call the flow goes straight to the line 363 of AbstractPageStore.java,
> > without entering the finally block. So, an infinite loop starts, causing
> the
> > StackOverflow.
> >
> > During the tab switch of the screen that works, the line 393 of
> > Objects.java is never reached, meaning that this screen was not serialized,
> > right? This code is only reached during a tab switch of the screen that
> > throws StackOverFlow exception.
> >
> > What defines if a page should be serialized/deserialized? Does anyone know
> > what could be causing these problems?
> >
> >
> > On Wed, Apr 2, 2008 at 7:28 PM, Daniel Stoch <[EMAIL PROTECTED]>
> > wrote:
> >
> > > Hi,
> > >
> > > It seems that this could be an OSGi related issue. We have the similar
> > > problem in our applications.
> > > You can look at the thread: Wicket + OSGI + Session (november 2007).
> > > Then Sebastiaan gave me a tip that this can be ClassNotFoundException:
> > >
> > > "It's probably a ClassNotFoundException on deserialization which gets
> > > eaten by ObjectInputStream (there's a bug report at Sun for this). To be
> > > sure you can debug trapping on ClassNotFoundException (caught and
> uncaught)
> > > when this problem occurs.
> > >
> > > However, since it's in a page you can easily fix this one: either
> > > upgrade to trunk and implement your own IClassResolver and register it
> with
> > > the application, or write your own IObjectStreamFactory implementation
> and
> > > register it with the Objects class.
> > >
> > > In either case, have a look at the DefaultObjectStreamFactory to see how
> > > to write a hook to look up classes in an ObjectInputStream implementation
> > > (resolveClass method)."
> > >
> > >
> > > Inside OSGI environment each bundle has its own class loader, so this
> > > could leeds to problem when you try to use in your app a class defined in
> > > another bundle.
> > > I've solved this problem by implementing my own IClassResolver. The
> > > default Wicket DefaultClassResolver is a final class, so we must make a
> copy
> > > of it and make a little change at the end of resolveClass method.
> > >
> > > The default implementation (DefaultClassResolver):
> > >
> > > synchronized (classes)
> > > {
> > > ClassLoader loader =
> > > Thread.currentThread().getContextClassLoader();
> > > if (loader == null)
> > > {
> > > loader =
> > > DefaultClassResolver.class.getClassLoader();
> > > }
> > > clazz = loader.loadClass(classname);
> > > }
> > >
> > > When there is a ClassLoader attached to the current thread as context
> > > class loader, then Wicket uses it. The problem is under OSGi, that the
> > > related class (with classname) can be located inside another bundle and
> can
> > > be loaded by another class loader, not this from current thread. So
> > > DefaultClassResolver fails to find this class. The solution is to try in
> > > such situation use the class loader which loads DefaultClassResolver
> class
> > > (= which loads all Wicket classes). In our CustomClassResolver this block
> > > was changed to something like this:
> > >
> > > synchronized (classes) {
> > > ClassLoader loader =
> > > Thread.currentThread().getContextClassLoader();
> > > if (loader == null) {
> > > loader =
> > > DefaultClassResolver.class.getClassLoader();
> > > clazz = loader.loadClass(classname);
> > > } else {
> > > try {
> > > clazz = loader.loadClass(classname);
> > > } catch (ClassNotFoundException e) {
> > > loader =
> > > DefaultClassResolver.class.getClassLoader();
> > > clazz = loader.loadClass(classname);
> > > }
> > > }
> > > }
> > >
> > > Then in your Application class init() method add the following line:
> > > getApplicationSettings().setClassResolver(new CustomClassResolver());
> > >
> > > But there is a one assumption, that bundle with Wicket classes (you
> > > probably have a Wicket bundled somehow in your app, don't you? :)),
> should
> > > have a dynamic import for all classes which can be located in many
> different
> > > bundles:
> > > DynamicImport-Package: *
> > >
> > > Maybe such change could be done in Wicket core (in DefaultClassResolver
> > > class)?
> > >
> > > --
> > > Daniel Stoch
> > >
> > >
> > > On 2008-03-29, at 22:22, Daniel Wu wrote:
> > >
> > > >
> > > > I've updated my wicket application to Wicket 1.3.2, but now, when I
> > > > try to
> > > > switch between my application tabs (my tabs extend
> > > > org.apache.wicket.extensions.markup.html.tabs.AbstractTab) I'm getting
> > > > this
> > > > error:
> > > >
> > > > ERROR RequestCycle () - Could not deserialize object using
> > > >
> > > >
> `org.apache.wicket.util.io.IObjectStreamFactory$DefaultObjectStreamFactory`
> > > > object factory
> > > > java.lang.RuntimeException: Could not deserialize object using
> > > >
> > > >
> `org.apache.wicket.util.io.IObjectStreamFactory$DefaultObjectStreamFactory`
> > > > object factory
> > > > at
> > > > org.apache.wicket.util.lang.Objects.byteArrayToObject(Objects.java:411)
> > > > at
> > > >
> > > >
> org.apache.wicket.protocol.http.pagestore.AbstractPageStore.deserializePage(AbstractPageStore.java:228)
> > > > at
> > > >
> > > >
> org.apache.wicket.protocol.http.pagestore.DiskPageStore.getPage(DiskPageStore.java:706)
> > > > at
> > > >
> > > >
> org.apache.wicket.protocol.http.SecondLevelCacheSessionStore$SecondLevelCachePageMap.get(SecondLevelCacheSessionStore.java:311)
> > > > at org.apache.wicket.Session.getPage(Session.java:751)
> > > > ...
> > > > Caused by: java.io.StreamCorruptedException: invalid type code: 29
> > > > at java.io.ObjectInputStream.readObject0(Unknown Source)
> > > > at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
> > > > at java.io.ObjectInputStream.readSerialData(Unknown Source)
> > > > at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
> > > > at java.io.ObjectInputStream.readObject0(Unknown Source)
> > > > at java.io.ObjectInputStream.readObject(Unknown Source)
> > > > at
> > > > org.apache.wicket.util.lang.Objects.byteArrayToObject(Objects.java:393)
> > > >
> > > > I've already downloaded and used the latest wicket 1.3 snapshot, which
> > > > was
> > > > suggested to me here: https://issues.apache.org/jira/browse/WICKET-1445
> > > > ,
> > > > but I'm still having this error.
> > > >
> > > > I'm still using an old release of wicket-extensions. Since I updated
> > > > to
> > > > wicket 1.3, I'm also having this warning:
> > > >
> > > > WARN AbstractTextComponent () - Couldn't resolve model type of
> > > > Model:classname=[...], please set the type yourself.
> > > >
> > > > Could any of these be related to the Serialization error? Does anyone
> > > > have
> > > > any idea of what is causing it?
> > > >
> > > > Daniel
> > > >
> > > > --
> > > > View this message in context: http://www.nabble.com/
> > > >
> java.io.StreamCorruptedException%3A-invalid-type-code%3A-29-tp16374745p16374745.html
> > > > Sent from the Wicket - User mailing list archive at Nabble.com.
> > > >
> > > >
> > > > ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > >
> > > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > For additional commands, e-mail: [EMAIL PROTECTED]
> > >
> > >
> >
>
--
Resizable and reorderable grid components.
http://www.inmethod.com
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]