2016-03-20 12 views
1

Ich mache einen Ajax-Aufruf an das Servlet. Ich möchte die Daten wieder aus dem Servlet zum jsp:java.lang.IllegalArgumentException: Klasse java.text.DecimalFormat deklariert mehrere JSON-Felder mit dem Namen maximumIntegerDigits

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); 
} 

Ich habe die GSon.jar in dem Classpath hinzugefügt. Aber ich bekomme einen Fehler: Vollständige Liste ist wie folgt: Was fehlt mir hier?

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

Wo ist der 'JSon'? –

+0

Sollte ich eine andere Bibliothek für JSON hinzufügen? –

+0

Ich denke, da ist etwas falsch mit Ihrem 'Json' –

Antwort

0

Ihre Klasse KitapData hat irgendwo eine DecimalFormat Eigenschaft. Gson über ihn fällt, weil es kein Standard-Java-Typ ist, für die es builtin Unterstützung wie String hat, Number, Boolean, Date, List usw.

Sie müssen diese DecimalFormat Eigenschaft entfernen. Nicht nur, weil Gson es nicht automatisch verdauen kann, ohne registered a type adapter zu haben, sondern auch, weil es unmöglich eine "Bohneneigenschaft" darstellen kann, und es ist im Wesentlichen eine enge Kopplung. Darüber hinaus ist NumberFormat wie DateFormat alle Freunde nicht threadsafe. Wenn Sie es als Bean-Eigenschaft angeben, ist es unter mehreren Threads gemeinsam nutzbar. Dies kann zu beschädigter Formatierung oder sogar zu Ausnahmen führen.

Vielleicht wollten Sie nur das Formatmuster oder andere verwandte Eigenschaften speichern. Speichern Sie sie in diesem Fall als String, Integer usw. und stellen Sie sicher, dass der Code immer eine brandneue DecimalFormat Instanz im lokalen Bereich der Methode basierend auf diesen "losen" Eigenschaften erstellt.

0

Es ist unwahrscheinlich, dass Sie tatsächlich ein Feld vom Typ DecimalFormat zu JSON serialisieren möchten. Wenn Sie die Klasse KitapData ändern können, können Sie in Betracht ziehen, das Feld zu entfernen oder transient zu machen, wodurch Gson (und andere Serializer) das Feld ignorieren.

private transient DecimalFormat whateverTheFieldIsCalled; 

Wenn Sie die KitapData Klasse nicht ändern können, gibt es andere Möglichkeiten Gson zu sagen, das Feld von Serialisierung ausschließen - zum Beispiel ein SimpleDateFormat Feld in der DO sieht Gson: How to exclude specific fields from Serialization without annotations

1

Mein Fall ist der Fehler verursacht ,
nach dem Hinzufügen transient zu ihm, Problem gelöst