-1

So I'm having an issue writing to the db on click. On click: I am calling an API, grabbing the data, and writing to a DB table.

I'm getting a NotSerializableException exception and I believe it to be because I'm calling the dao in the click:

        proImage.add(new AjaxEventBehavior("click") {

                private static final long serialVersionUID = 1L;

                @Override
                protected void onEvent(AjaxRequestTarget target) {
                    try {
                         updateGamesPlayed(player.getSummonerId());

                    } catch (RiotApiException e) {
                        e.printStackTrace();
                    }
                }
            });

Should my DAO be serializable? I had an issue like this before, but it wasn't actually related to anything missing "Serializable".

Here is the stack trace:

20:42:08.639 [qtp17407842-12] ERROR org.apache.wicket.serialize.java.JavaSerializer - Error serializing object class com.riot.itemsets.HomePage [object=[Page class = com.riot.itemsets.HomePage, id = 0, render count = 1]]
org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream$ObjectCheckException: The object type is not Serializable!
A problem occurred while checking object with type: com.riot.itemsets.dao.ProGamesDaoJdbc
Field hierarchy is:
  0 [class=com.riot.itemsets.HomePage, path=0]
    private java.lang.Object org.apache.wicket.MarkupContainer.children [class=org.apache.wicket.MarkupContainer$ChildList]
      private java.lang.Object[] org.apache.wicket.MarkupContainer$ChildList.childs [class=[Ljava.lang.Object;]
        private java.lang.Object[] org.apache.wicket.MarkupContainer$ChildList.childs[0] [class=com.riot.itemsets.RegionPanel, path=0:regionPanel0]
          private java.lang.Object org.apache.wicket.MarkupContainer.children [class=org.apache.wicket.MarkupContainer$ChildList]
            private java.lang.Object[] org.apache.wicket.MarkupContainer$ChildList.childs [class=[Ljava.lang.Object;]
              private java.lang.Object[] org.apache.wicket.MarkupContainer$ChildList.childs[0][1] [class=com.riot.itemsets.TeamPanel, path=0:regionPanel0:teamPanel0]
                private java.lang.Object org.apache.wicket.MarkupContainer.children [class=org.apache.wicket.MarkupContainer$ChildList]
                  private java.lang.Object[] org.apache.wicket.MarkupContainer$ChildList.childs [class=[Ljava.lang.Object;]
                    private java.lang.Object[] org.apache.wicket.MarkupContainer$ChildList.childs[0][1] [class=com.riot.itemsets.PlayerPanel, path=0:regionPanel0:teamPanel0:playerPanel0]
                      private com.riot.itemsets.dao.ProGamesDaoJdbc com.riot.itemsets.PlayerPanel.proGamesDao [class=com.riot.itemsets.dao.ProGamesDaoJdbc] <----- field that is causing the problem
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:364) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:343) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.checkFields(CheckingObjectOutputStream.java:606) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:542) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:343) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:405) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:343) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.checkFields(CheckingObjectOutputStream.java:606) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:542) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:343) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.checkFields(CheckingObjectOutputStream.java:606) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:542) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:343) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:405) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:343) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.checkFields(CheckingObjectOutputStream.java:606) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:542) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:343) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.checkFields(CheckingObjectOutputStream.java:606) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:542) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:343) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:405) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:343) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.checkFields(CheckingObjectOutputStream.java:606) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:542) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:343) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.checkFields(CheckingObjectOutputStream.java:606) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.internalCheck(CheckingObjectOutputStream.java:542) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.check(CheckingObjectOutputStream.java:343) ~[wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream.writeObjectOverride(CheckingObjectOutputStream.java:674) ~[wicket-core-7.0.0.jar:7.0.0]
    at java.io.ObjectOutputStream.writeObject(Unknown Source) ~[?:1.8.0_25]
    at org.apache.wicket.serialize.java.JavaSerializer$SerializationCheckerObjectOutputStream.writeObjectOverride(JavaSerializer.java:271) ~[wicket-core-7.0.0.jar:7.0.0]
    at java.io.ObjectOutputStream.writeObject(Unknown Source) ~[?:1.8.0_25]
    at org.apache.wicket.serialize.java.JavaSerializer.serialize(JavaSerializer.java:78) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.pageStore.AbstractPageStore.serializePage(AbstractPageStore.java:133) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.pageStore.DefaultPageStore.createSerializedPage(DefaultPageStore.java:281) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.pageStore.DefaultPageStore.storePage(DefaultPageStore.java:61) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.page.PageStoreManager$PersistentRequestAdapter.storeTouchedPages(PageStoreManager.java:403) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.page.RequestAdapter.commitRequest(RequestAdapter.java:193) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.page.AbstractPageManager.commitRequest(AbstractPageManager.java:76) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.page.PageManagerDecorator.commitRequest(PageManagerDecorator.java:74) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.page.PageAccessSynchronizer$2.commitRequest(PageAccessSynchronizer.java:270) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.Application$3.onDetach(Application.java:1755) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.request.cycle.RequestCycleListenerCollection$3.notify(RequestCycleListenerCollection.java:105) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.request.cycle.RequestCycleListenerCollection$3.notify(RequestCycleListenerCollection.java:101) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.util.listener.ListenerCollection$1.notify(ListenerCollection.java:120) [wicket-util-7.0.0.jar:7.0.0]
    at org.apache.wicket.util.listener.ListenerCollection.reversedNotify(ListenerCollection.java:144) [wicket-util-7.0.0.jar:7.0.0]
    at org.apache.wicket.util.listener.ListenerCollection.reversedNotifyIgnoringExceptions(ListenerCollection.java:113) [wicket-util-7.0.0.jar:7.0.0]
    at org.apache.wicket.request.cycle.RequestCycleListenerCollection.onDetach(RequestCycleListenerCollection.java:100) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.request.cycle.RequestCycle.onDetach(RequestCycle.java:645) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.request.cycle.RequestCycle.detach(RequestCycle.java:594) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:297) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:261) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:203) [wicket-core-7.0.0.jar:7.0.0]
    at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:284) [wicket-core-7.0.0.jar:7.0.0]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) [org.eclipse.jetty.servlet_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) [org.eclipse.jetty.servlet_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) [org.eclipse.jetty.server_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577) [org.eclipse.jetty.security_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) [org.eclipse.jetty.server_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127) [org.eclipse.jetty.server_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) [org.eclipse.jetty.servlet_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) [org.eclipse.jetty.server_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) [org.eclipse.jetty.server_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [org.eclipse.jetty.server_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:52) [org.eclipse.jetty.server_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) [org.eclipse.jetty.server_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.server.Server.handle(Server.java:497) [org.eclipse.jetty.server_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310) [org.eclipse.jetty.server_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) [org.eclipse.jetty.server_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) [org.eclipse.jetty.io_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) [org.eclipse.jetty.util_9.2.9.v20150224.jar:9.2.9.v20150224]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) [org.eclipse.jetty.util_9.2.9.v20150224.jar:9.2.9.v20150224]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_25]
Caused by: java.io.NotSerializableException: com.riot.itemsets.dao.ProGamesDaoJdbc
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeArray(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeArray(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeArray(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) ~[?:1.8.0_25]
    at java.io.ObjectOutputStream.writeObject(Unknown Source) ~[?:1.8.0_25]
    at org.apache.wicket.serialize.java.JavaSerializer$SerializationCheckerObjectOutputStream.writeObjectOverride(JavaSerializer.java:260) ~[wicket-core-7.0.0.jar:7.0.0]
    ... 42 more

And here is the beginning of the DAO:

public class ProGamesDaoJdbc implements ProGamesDao{

private JdbcTemplate jdbcTemplateObject;

  private class GamesMapper implements RowMapper<Games>{

      @Override
      public Games mapRow(ResultSet rs, int rowNum) throws SQLException {
        Games game = new Games();
        game.setGameId(rs.getLong("gameid"));
        game.setWinner((rs.getInt("winner") == 1));
        game.setLane(rs.getString("lane"));
        game.setItem0(rs.getString("item0"));
        game.setItem1(rs.getString("item1"));
        game.setItem2(rs.getString("item2"));
        game.setItem3(rs.getString("item3"));
        game.setItem4(rs.getString("item4"));
        game.setItem5(rs.getString("item5"));
        game.setItem6(rs.getString("item6"));
        game.setGoldSpent(rs.getLong("goldspent"));
        game.setChampId(rs.getInt("champid"));
        game.setChampName(rs.getString("champname"));
        game.setChampImage(rs.getString("champimage"));
        game.setEnemyChampId(rs.getInt("enemychampid"));
        game.setEnemyChampName(rs.getString("enemychampname"));
        game.setEnemyChampImage(rs.getString("enemychampimage"));
        game.setSummonerId(rs.getLong("summonerid"));
        return game;
      } 
  }

  @Override
  public void setDataSource(DataSource dataSource) {
        this.jdbcTemplateObject = new JdbcTemplate(dataSource);
  }


  @Override
  public void create(Games game) {
      ...
      ...
  }
  ....
  ....
  ....
}
Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197
D2Gambit
  • 21
  • 6
  • I have not tried, but should it not be "onclick" in event behavior? – Mihir Aug 15 '15 at 08:13
  • @Mihir I have tried this, but it makes no difference. The click event IS happening and the application does not crash, but on initial load of the webpage I'm getting this serializable exception UNLESS I move the api/query call outside of the click. – D2Gambit Aug 15 '15 at 16:28
  • As wicket uses serialization for page and it's components, at the time of click of the link, it seems trying to find the Dao from pagestore and throwing the exception. As your Dao is property of the page, you might need to serialize it. Are you using spring bean? Just curious. – Mihir Aug 16 '15 at 04:02
  • I am using spring bean, but I'm not using the @SpringBean connotation. I'm doing this: ` ` and using initializing the dao as this: `ApplicationContext context = new ClassPathXmlApplicationContext("Spring-Module.xml"); ProGamesDaoJdbc proGamesDao = (ProGamesDaoJdbc) context.getBean("proGamesDaoJdbc");` – D2Gambit Aug 16 '15 at 04:35
  • Also, I definitely think you're right about having to serialize the dao. When I try to add `implements Serializable` to my dao class, i get an exception that says the JdbcTemplateObject cannot be serialized. Do you know how I can serialize my DAO? It may be easier if there is an easier way for me to communicate with you and you could help me fix the issue :) Like skype or something? – D2Gambit Aug 16 '15 at 04:41
  • If you are not using, then you need to use spring interceptor in your wicket application. You can Google wicket spring integration for that. Let me know your email, we can communicate Monday. – Mihir Aug 16 '15 at 05:08

1 Answers1

2

In your PlayerPanel you should inject ProGamesDaoJdbc with:

@SpringBean
private ProGamesDaoJdbc dao;

This will create a serializable proxy that is safe to be stored as a member field in Wicket components.

When using:

ProGamesDaoJdbc proGamesDao = (ProGamesDaoJdbc) context.getBean("proGamesDaoJdbc");

You get the raw bean, i.e. there is no serializable proxy around it.

martin-g
  • 17,243
  • 2
  • 23
  • 35
  • This is what I'm trying to do now. However, I'm getting this issue: `Class [org.springframework.beans.ExtendedBeanInfoFactory] is not assignable to [org.springframework.beans.BeanInfoFactory]` I've got the applicationContext defining the beans, but for some reason this error is coming. I also have all spring-*.jars as version 4.2.0.RELEASE, so I have no clue why this is throwing exceptions. – D2Gambit Aug 16 '15 at 18:49