2012-03-05 4 views
0

私はWicketでJacksonのObjectMapperを使用しようとしています。一般的には動作していますが、シリアライゼーションの例外がスローされます。[class=org.codehaus.jackson.map.ObjectMapper] <----- field that is not serializableJackson ObjectMapperをシリアライズ可能にする

フィールドをprivate ObjectMapper mapper = new ObjectMapper();に設定しています。

を試してみると、同じ結果になります。private ObjectMapper mapper = new ObjectMapper().setSerializerProvider(new StdSerializerProvider());私は右(構成の組み合わせ)が欠落していると思いますか?適切な組み合わせへの指針は高く評価されます。

フルスタックトレース:

*ERROR:Error serializing object class ....web.backend.overview.OverviewPage [object=[Page class = ....web.backend.overview.OverviewPage, id = 1, render count = 1]] 
org.apache.wicket.util.io.SerializableChecker$WicketNotSerializableException: Unable to serialize class: org.codehaus.jackson.map.ObjectMapper 
Field hierarchy is: 
    1 [class=....web.backend.overview.OverviewPage, path=1] 
    private java.lang.Object org.apache.wicket.MarkupContainer.children [class=[Ljava.lang.Object;] 
     private org.apache.velocity.app.VelocityEngine ....web.BasePanel.velocityEngine[5] [class=....web.backend.overview.MailBoxQuickOverViewPanel, path=1:mailboxQuickOverviewPanel] 
     private java.lang.Object org.apache.wicket.MarkupContainer.children [class=[Ljava.lang.Object;] 
      private java.lang.Object org.apache.wicket.MarkupContainer.children[0] [class=....web.backend.overview.ChartPanel, path=1:mailboxQuickOverviewPanel:chartPanel] 
      private java.lang.Object org.apache.wicket.MarkupContainer.children [class=com.comsysto.insight.component.HighchartsPanel, path=1:mailboxQuickOverviewPanel:chartPanel:chart] 
       private java.lang.Object org.apache.wicket.MarkupContainer.children [class=[Ljava.lang.Object;] 
       private java.lang.Object org.apache.wicket.MarkupContainer.children[1] [class=org.apache.wicket.markup.html.basic.Label, path=1:mailboxQuickOverviewPanel:chartPanel:chart:script] 
        java.lang.Object org.apache.wicket.Component.data [class=com.comsysto.insight.component.HighchartsPanel$1] 
        final com.comsysto.insight.model.Highchart com.comsysto.insight.component.HighchartsPanel$1.val$highcharts [class=com.comsysto.insight.model.Highchart] 
         private org.codehaus.jackson.map.ObjectMapper com.comsysto.insight.model.Highchart.mapper [class=org.codehaus.jackson.map.ObjectMapper] <----- field that is not serializable 
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:386) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:646) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:569) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:646) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:569) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:646) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:569) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:431) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:646) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:569) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:646) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:569) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:431) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:646) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:569) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:431) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.checkFields(SerializableChecker.java:646) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.internalCheck(SerializableChecker.java:569) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.check(SerializableChecker.java:365) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.io.SerializableChecker.writeObjectOverride(SerializableChecker.java:715) ~[wicket-core-1.5.4.jar:1.5.4] 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) ~[na:1.6.0_29] 
    at org.apache.wicket.serialize.java.JavaSerializer$CheckerObjectOutputStream.writeObjectOverride(JavaSerializer.java:258) ~[wicket-core-1.5.4.jar:1.5.4] 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) ~[na:1.6.0_29] 
    at org.apache.wicket.serialize.java.JavaSerializer.serialize(JavaSerializer.java:77) ~[wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.pageStore.DefaultPageStore.serializePage(DefaultPageStore.java:368) [wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.pageStore.DefaultPageStore.storePage(DefaultPageStore.java:146) [wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.page.PageStoreManager$PersistentRequestAdapter.storeTouchedPages(PageStoreManager.java:383) [wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.page.RequestAdapter.commitRequest(RequestAdapter.java:171) [wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.page.AbstractPageManager.commitRequest(AbstractPageManager.java:94) [wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.page.PageManagerDecorator.commitRequest(PageManagerDecorator.java:68) [wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.page.PageAccessSynchronizer$2.commitRequest(PageAccessSynchronizer.java:281) [wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.Application$2.onDetach(Application.java:1598) [wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.request.cycle.RequestCycleListenerCollection$3.notify(RequestCycleListenerCollection.java:99) [wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.request.cycle.RequestCycleListenerCollection$3.notify(RequestCycleListenerCollection.java:97) [wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.listener.ListenerCollection$1.notify(ListenerCollection.java:119) [wicket-util-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.listener.ListenerCollection.reversedNotify(ListenerCollection.java:143) [wicket-util-1.5.4.jar:1.5.4] 
    at org.apache.wicket.util.listener.ListenerCollection.reversedNotifyIgnoringExceptions(ListenerCollection.java:113) [wicket-util-1.5.4.jar:1.5.4] 
    at org.apache.wicket.request.cycle.RequestCycleListenerCollection.onDetach(RequestCycleListenerCollection.java:95) [wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.request.cycle.RequestCycle.onDetach(RequestCycle.java:600) [wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.request.cycle.RequestCycle.detach(RequestCycle.java:539) [wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:287) [wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:162) [wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:218) [wicket-core-1.5.4.jar:1.5.4] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) [catalina.jar:7.0.25] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.25] 
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:359) [shiro-web-1.1.0.jar:na] 
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:275) [shiro-web-1.1.0.jar:na] 
    at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) [shiro-core-1.1.0.jar:1.1.0] 
    at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) [shiro-core-1.1.0.jar:1.1.0] 
    at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:344) [shiro-core-1.1.0.jar:1.1.0] 
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:272) [shiro-web-1.1.0.jar:na] 
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:81) [shiro-web-1.1.0.jar:na] 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) [spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259) [spring-web-3.1.0.RELEASE.jar:3.1.0.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) [catalina.jar:7.0.25] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.25] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) [catalina.jar:7.0.25] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) [catalina.jar:7.0.25] 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) [catalina.jar:7.0.25] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) [catalina.jar:7.0.25] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) [catalina.jar:7.0.25] 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) [catalina.jar:7.0.25] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) [catalina.jar:7.0.25] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) [catalina.jar:7.0.25] 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) [tomcat-coyote.jar:7.0.25] 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) [tomcat-coyote.jar:7.0.25] 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) [tomcat-coyote.jar:7.0.25] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [na:1.6.0_29] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [na:1.6.0_29] 
    at java.lang.Thread.run(Thread.java:680) [na:1.6.0_29] 
Caused by: java.io.NotSerializableException: org.codehaus.jackson.map.ObjectMapper 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1346) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1154) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) ~[na:1.6.0_29] 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) ~[na:1.6.0_29] 
    at org.apache.wicket.serialize.java.JavaSerializer$CheckerObjectOutputStream.writeObjectOverride(JavaSerializer.java:250) ~[wicket-core-1.5.4.jar:1.5.4] 
    ... 48 common frames omitted 
+2

これは 'ObjectMapper'自体をシリアル化しようとしているようです。どうしてそうするか? – beerbajay

+0

私の理解では、「マッパー」は直列化可能である必要がありますが、そうではありません。だから私はそれをシリアライズ可能にしようとしています。それともこれは間違ったアプローチですか? – xeraa

+0

'ObjectMapper'は他のオブジェクトのシリアライズに使用されます。なぜここでそれをシリアル化する必要があると思いますか? – beerbajay

答えて

3

ObjectMapperをシリアライズするべきではありません。それはSerializableではない、そして正当な理由のために。

あなたの使用法に関連する他の問題があります。他の人が指摘しているように、シリアル化可能性またはその不一致がObjectMapperであると問題を引き起こす原因はありません。 ほとんどの場合、誤ってMapperなどに依存している可能性があります。これらの依存関係を削除します。マッパーは通常、静的なシングルトン(これは問題ありません)としてアクセスされるか、GuiceやSpring IoCのようなものを使って注入されます。

元の質問に基づいて、おそらくObjectMapperという静的インスタンスを作成してください。要求ごとに新しいインスタンスを作成せず、インスタンスを再利用することは非常に重要です。

EDIT(2013/10):@Jason、ObjectMapperで指摘されているように、これはもはや真です。いくつかのプラットフォームで使用されると、例えばAndroid上で、マッパーを「フリーズ」する能力がパフォーマンスに勝つ可能性があるという理由が考えられます。私はそれをデフォルト戦略として推奨しませんが、少なくともオプションです。

+0

新しいインスタンスを作成するのに費用がかかるからです。私も最終的な静的を試しましたが、それは直列化の例外を助けませんでした。私の現在の解決策はhttps://github.com/xeraa/Ubercharts/blob/master/ubercharts-lib/src/main/java/com/comsysto/insight/model/Highchart.java#L82ですか、それとも間違っていますか? – xeraa

+0

作成は高価ではありませんが、最初の使用にはコストがかかります。マッパーはすべての必要な部分をキャッシュするものです。したがって、インスタンスを再利用する場合に比べて10倍から100倍は遅くなります。 – StaxMan

+0

静的メンバーが動作するはずです(静的なLoggerは既に使用しています)。トランジェントエントリはシリアル化されていないため、キーワード 'transient'を追加することもできます。 – StaxMan

関連する問題