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
>