I'm upgrading from Wicket 1.2.4 to 1.2.6 and there's obviously a change I'm
not able to find concerning the session (or...who knows?)

I've got a simple pair of pages, one for viewing a list of entity beans
(EJB3) and one for editing a chosen entity from the list page.  I'm
comparing it to dozens of pages I've built like this in the past in previous
versions of Wicket and I just can't figure out why I keep getting this
exception:

***********************************************************
Internal error cloning object. Make sure all dependent objects implement
Serializable. Class: com.myapp.ui.admin.EditPilot
wicket.WicketRuntimeException: Internal error cloning object. Make sure all
dependent objects implement Serializable. Class:
com.myapp.ui.admin.EditPilot
        at
wicket.protocol.http.HttpSessionStore.setAttribute(HttpSessionStore.java:63)
        at wicket.Session.setAttribute(Session.java:952)
        at wicket.PageMap.put(PageMap.java:531)
        at wicket.Session.touch(Session.java:744)
        at wicket.Page.renderPage(Page.java:414)
        at
wicket.request.target.component.BookmarkablePageRequestTarget.respond(BookmarkablePageRequestTarget.java:226)
        at
wicket.request.compound.DefaultResponseStrategy.respond(DefaultResponseStrategy.java:49)
        at
wicket.request.compound.AbstractCompoundRequestCycleProcessor.respond(AbstractCompoundRequestCycleProcessor.java:66)
        at
wicket.RequestCycle.doProcessEventsAndRespond(RequestCycle.java:902)
        at
wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:929)
        at wicket.RequestCycle.step(RequestCycle.java:1010)
        at wicket.RequestCycle.steps(RequestCycle.java:1084)
        at wicket.RequestCycle.request(RequestCycle.java:454)
        at wicket.protocol.http.WicketServlet.doGet(WicketServlet.java:219)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:718)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
        at
org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:317)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
        at
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
        at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:288)
        at
org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:271)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202)
        at
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
        at
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
        at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206)
        at
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
        at
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150)
        at
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
        at
org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
        at
org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
        at
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:270)
        at
com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637)
        at
com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568)
        at
com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813)
        at
com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:339)
        at
com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:261)
        at
com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:212)
        at
com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:361)
        at
com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
        at
com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
Caused by: java.io.NotSerializableException:
com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate
        at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
        at
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
        at
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
        at
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
        at
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
        at
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at
java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338)
        at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146)
        at
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
        at
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
        at
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at
java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338)
        at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146)
        at
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
        at
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
        at
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
        at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
        at
java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
        at
wicket.protocol.http.HttpSessionStore.setAttribute(HttpSessionStore.java:57)
        ... 47 more
***********************************************************

Here's the EditPilot class:

***********************************************************
public class EditPilot extends PublicPage
{
        public EditPilot()
        {
                this(null);
        }

        public EditPilot(Pilot pilot)
        {
                //add page components
                add(new FeedbackPanel("feedbackPanel"));
                
                //edit or new?
                if (pilot == null) pilot = new Pilot();
                
                //get bean interface
                final PilotLocal bean = BeanLookup.get("PilotBean");
                
                //init form object
                final Form pilotForm = new Form("pilotForm", new
CompoundPropertyModel(pilot));
                
                //add form components
                pilotForm.add(new TextField("salutation")
                                .add(StringValidator.lengthBetween(1, 3)));
                pilotForm.add(new TextField("firstName")
                                .setRequired(true)
                                .add(StringValidator.lengthBetween(2, 50)));
                pilotForm.add(new TextField("lastName")
                                .setRequired(true)
                                .add(StringValidator.lengthBetween(2, 50)));
                
                pilotForm.add(new Button("saveButton")
                {
                        public void onSubmit()
                        {
                                try
                                {
                                        //save form values, redirect
                                        Pilot pilot = 
(Pilot)pilotForm.getModelObject();
                                        bean.persist(pilot);
                                        
                                        setResponsePage(new ViewPilots());
                                }
                                catch (Exception exp)
                                {
                                        info(exp.getMessage());
                                }
                        }
                });
                
                //add cancel button
                pilotForm.add(new Button("cancelButton")
                {
                        public void onSubmit()
                        {                                       
                                setResponsePage(new ViewPilots());
                        }
                }.setDefaultFormProcessing(false));
                
                //add form to page
                add(pilotForm);
        }
}

which inherits this...

public abstract class PublicPage extends BasePage
{
        public PublicPage()
        {
        }
}

which inherits this...

public abstract class BasePage extends WebPage
{
        public BasePage()
        {
                //add page components
                add(new UserHeaderPanel("userHeaderPanel"));
                add(new TabPanel("tabPanel"));
                add(new FooterPanel("footerPanel"));
        }
        
        protected void redirect(String url) //utility method for redirecting
externally
        {
                //disable wicket redirecting
                getRequestCycle().setRedirect(false);

                //make sure no output for the current cycle is sent
                
getRequestCycle().setRequestTarget(EmptyRequestTarget.getInstance());

                //set absolute URL to redirect to
                getResponse().redirect(url);
        }
}

...and Abraham beget Lot...whom beget......etc.
***********************************************************

Here's the BeanLookup class:

***********************************************************
public class BeanLookup
{
        public static <T> T get(String name)
        {
                T bean = null;
                
                try
                {
                        InitialContext ctx = new InitialContext();
                        bean = (T)ctx.lookup("java:comp/env/" + name);          
                }
                catch (NamingException exp)
                {
                }
                
                return bean;
        }
}
***********************************************************

Here's my 'app' class:

***********************************************************
public class MyApp extends WebApplication
{
        @Override
  public Class getHomePage()
        {
                return Index.class;
        }
  
        @Override
        public void init()
        {
                //create external images resource
                getSharedResources().add("imageResource", new ImageResource()); 
        
        }
        
        /**
         * set custom session class
         */
        @Override
        public ISessionFactory getSessionFactory()
        {
                return new ISessionFactory()
                {
                        public Session newSession()
                        {
                                return new UserSession(MyApp.this);
                        }
                };
        }
}
***********************************************************

I've tried implementing Serializable all over the place but it doesn't
help...and comparing this to apps I've built in the past in previous
versions of Wicket, this is "correct".  I can pull up the ViewPilots page
just fine but if I even add a reference to the EditPilot page (i.e.
setResponsePage(new EditPilot())), then that page also throws the same
exception.

I'm on Ubuntu 7.10 and using Glassfish v2 as the container...but have
replicated the issue on Winxp and Vista.  As you can see from the error,
everything is being developed in Netbeans.

What's the obvious trivial detail I'm forgetting? :)

Thanks!
-- 
View this message in context: 
http://www.nabble.com/What-exactly-isn%27t-serializable--tf4863669.html#a13918451
Sent from the Wicket - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to