2016-03-20 5 views
1

サーブレットへのajax呼び出しを行っています。サーブレットからjspにデータを戻したい:java.lang.IllegalArgumentException:クラスjava.text.DecimalFormatは、maximumIntegerDigitsという名前の複数のJSONフィールドを宣言します。

PrintWriter out = response.getWriter(); 
    String isbn = (String) request.getParameter("isbn"); 
    BookDetail bd = new BookDetail(); 
    if(bd.ISBNFound(isbn)){ 
    ArrayList<KitapData> Books = bd.LoadBooksByISBN(isbn); 

    Gson gson = new Gson(); 
    String json = gson.toJson(Books); 
    response.setContentType("application/json"); 
    System.out.print(json);  
    out.print(json); 
} 

クラスパスにGSon.jarを追加しました。しかし、私は何らかのエラーを出しています:完全なリストは次のとおりです:私はここで何が欠けていますか?

WARNING: StandardWrapperValve[Book_CheckISBN]: Servlet.service() for servlet Book_CheckISBN threw exception 
java.lang.IllegalArgumentException: class java.text.DecimalFormat declares multiple JSON fields named maximumIntegerDigits 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:122) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 
    at com.google.gson.Gson.getAdapter(Gson.java:356) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 
    at com.google.gson.Gson.getAdapter(Gson.java:356) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:55) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60) 
    at com.google.gson.Gson.toJson(Gson.java:593) 
    at com.google.gson.Gson.toJson(Gson.java:572) 
    at com.google.gson.Gson.toJson(Gson.java:527) 
    at com.google.gson.Gson.toJson(Gson.java:507) 
    at book.ctrl.Book_CheckISBN.doPost(Book_CheckISBN.java:41) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201) 
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175) 
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112) 
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561) 
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545) 
    at java.lang.Thread.run(Thread.java:722) 
+0

「JSon」はどこですか? –

+0

JSON用に他のライブラリを追加する必要がありますか? –

+0

あなたの 'Json'に何か問題があると思います –

答えて

0

あなたのクラスKitapDataはどこかDecimalFormat性質を持っています。それは、このようなStringNumberBooleanDateListとして組み込みサポートを持っている標準的なJavaタイプではないのでGsonはあなたがそのDecimalFormatプロパティを削除する必要が

など、その上に落下されます。 Gsonは registered a type adapterを持たずに自動的にダイジェストできないだけでなく、 "ビーンプロパティ"を不可能に表現することができ、本質的にタイトカップリングであるためです。さらに、 NumberFormatDateFormatのすべての友人 スレッドセーフではありませんです。これをBeanプロパティとして持つことは、複数のスレッド間で共有可能であることを示します。これにより、フォーマットが破損したり、例外が発生する可能性があります。

おそらく、フォーマットパターンやその他の関連プロパティを保存したかっただけです。その場合は、代わりにStringIntegerなどとして保存し、これらの「緩い」プロパティに基づいてメソッドのローカルスコープに常に新しいDecimalFormatインスタンスを作成するようにしてください。

0

実際にJSONにDecimalFormatのフィールドをシリアル化することは考えにくいです。 KitapDataクラスを変更できる場合は、フィールドを削除するか、Gson(および他のシリアライザ)にフィールドを無視するように指示するtransientにすることを検討できます。

private transient DecimalFormat whateverTheFieldIsCalled; 

あなたはシリアライズからフィールドを除外するGsonを伝えるために、他の方法があるKitapDataクラスを変更することができない場合 - 例えば参照Gson: How to exclude specific fields from Serialization without annotations

1

私の場合は、エラーの原因となってDOでSimpleDateFormatフィールドです、
transientを追加した後、問題が解決しました。

関連する問題