Re: [tools] Toolbox preventing session serialization
Claude Brisson <[email protected]> Tue, 11 Mar 2014 09:57:06 +0100
| Newsgroups | gmane.comp.jakarta.velocity.user |
|---|---|
| Message-ID | <[email protected]> |
The session toolbox is always created by default, to let users access standard session tools. There is a create-session parameter you can use for this purpose, see: http://velocity.apache.org/tools/releases/2.0/config.xml.html Yes, the problem is org.apache.velocity.runtime.log.Log, which is not serializable. It's rather logic, since a logger is basically an output stream. But some session standard tools keep a reference on a logger. There is a design issue we should adress, here. Claude On 06/03/2014 19:04, Christopher Schultz wrote: > Claude, > > On 3/6/14, 3:32 AM, Claude Brisson wrote: >> The Toolbox itself is seralizable. But it's enough to have only one >> non-serializable object inside the toolbox. There should be more >> informations in the stack trace. > Here's the stack trace I get from Tomcat: > > java.io.NotSerializableException: org.apache.velocity.runtime.log.Log > at > java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1354) > at > java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990) > at > java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915) > at > java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798) > at > java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) > at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) > at java.util.HashMap.readObject(HashMap.java:1184) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:606) > at > java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017) > at > java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1893) > at > java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798) > at > java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) > at > java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990) > at > java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915) > at > java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798) > at > java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) > at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) > at > org.apache.catalina.session.StandardSession.doReadObject(StandardSession.java:1602) > > Looks like the logger is the problem? > > I can confirm that removing the Toolbox object from the session prior to > restarting will allow my session to resume, so its definitely the > Toolbox (or obviously some object references through it). > > Here's my toolbox configuration, if that helps: > > <tools> > <toolbox scope="application"> > <tool class="org.apache.velocity.tools.generic.AlternatorTool" /> > <tool key="floatMath" > class="org.apache.velocity.tools.generic.MathTool" /> > <tool key="escape" > class="org.apache.velocity.tools.generic.EscapeTool" /> > <tool key="possiblyEscape" class="com.mysoftware.util.HTMLEscapeTool" /> > > ^^^ This guy extends EscapeTool and adds a method, no data > > <tool key="dateFormat" > class="org.apache.velocity.tools.generic.DateTool" /> > <tool key="list" class="org.apache.velocity.tools.generic.ListTool" /> > <tool key="locallyNamedUtil" class="com.mysoftware.LocallyNamed$Util" /> > > ^^ This guy is a class without any data, but does not > implement Serializable. I'll modify it, but I don't suspect > it will change the Log problem shown above. > > <tool class="org.apache.velocity.tools.generic.SortTool" /> > <tool key="resource" > class="org.apache.velocity.tools.generic.ResourceTool" /> > </toolbox> > > <toolbox scope="request" xhtml="true"> > <tool class="org.apache.velocity.tools.struts.StrutsLinkTool" /> > <tool class="org.apache.velocity.tools.struts.ValidatorTool" /> > <tool key="msg" class="org.apache.velocity.tools.struts.MessageTool" /> > <tool class="org.apache.velocity.tools.struts.ErrorsTool" /> > <tool class="org.apache.velocity.tools.struts.FormTool" /> > <tool key="parameterParser" > class="org.apache.velocity.tools.view.tools.ParameterParser" /> > <tool key="cookies" class="org.apache.velocity.tools.view.CookieTool" /> > </toolbox> > </tools> > > My real question is why there is a Toolbox in my session at all... I > shouldn't need one, right? > > -chris >