Kann nicht deserialisiert Instanz von java.util.ArrayList aus START_OBJECT token
Ich versuche, einen BEITRAG List
von benutzerdefinierten Objekten.
Meine JSON-in-request-body wird dies:
{
"collection": [
{
"name": "Test order1",
"detail": "ahk ks"
},
{
"name": "Test order2",
"detail": "Fisteku"
}
]
}
Server-Seite code, der die Anforderung verarbeitet:
import java.util.Collection;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Path(value = "/rest/corder")
public class COrderRestService {
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response postOrder(Collection<COrder> orders) {
StringBuilder stringBuilder = new StringBuilder();
for (COrder c : orders) {
stringBuilder.append(c.toString());
}
System.out.println(stringBuilder);
return Response.ok(stringBuilder, MediaType.APPLICATION_JSON).build();
}
}
Person COrder
:
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class COrder {
String name;
String detail;
@Override
public String toString() {
return "COrder [name=" + name + ", detail=" + detail
+ ", getClass()=" + getClass() + ", hashCode()=" + hashCode()
+ ", toString()=" + super.toString() + "]";
}
}
Aber eine Ausnahme geworfen wird:
SEVERE: Failed executing POST /rest/corder
org.jboss.resteasy.spi.ReaderException: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
at [Source: org.apache.catalina.connector.CoyoteInputStream@6de8c535; line: 1, column: 1]
at org.jboss.resteasy.core.MessageBodyParameterInjector.inject(MessageBodyParameterInjector.java:183)
at org.jboss.resteasy.core.MethodInjectorImpl.injectArguments(MethodInjectorImpl.java:88)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:111)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:280)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:234)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:221)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
InformationsquelleAutor isah | 2013-12-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, das JSON - kann dies nicht standardmäßig deserialisiert werden in einem
Collection
denn es ist nicht eigentlich ein JSON-Array, das würde dann so Aussehen:Da bist du nicht der Kontrolle der genaue Prozess der Deserialisierung (RestEasy tut) - eine erste option wäre zu einfach injizieren Sie die JSON als
String
und dann Steuern der Deserialisierung:Würden Sie verlieren ein bisschen die Bequemlichkeit der nicht mit zu tun, dass Sie selbst, aber Sie würde leicht zu Sortieren, das problem.
Eine weitere option - wenn Sie nicht ändern können, die JSON - wäre zu bauen ein wrapper passen Sie die Struktur der JSON-input - und verwenden, statt
Collection<COrder>
.Hoffe, das hilft.
schön, kannst du uns erzählen, dass resteasy link hier bitte
gekommen, an es zu denken. Ich bin mir ziemlich sicher, dass ich den richtigen code und debugging dieser für Stunden, und die änderung meines codes auf dem Weg. Stellt sich heraus, ich war nur fehlen die eckigen Klammern, um anzuzeigen, mein post ist ein array.Arrg. Nun, ich denke, dies ist ein Anfänger, Fluch, LOL. Für jeden neuen JSON-und Spring-Daten, nicht Folgen meinen Spuren. 🙁
InformationsquelleAutor Eugen
Anstelle des JSON-Dokument, können Sie aktualisieren die ObjectMapper Objekt wie folgt :
InformationsquelleAutor Salah Atwa
Dies funktionieren wird:
Dem problem kann auftreten, wenn Sie versuchen zu Lesen, eine Liste mit einem einzigen element wie ein JsonArray eher als eine JsonNode oder Umgekehrt.
Da kann man nicht sicher wissen, ob die zurückgegebene Liste enthält ein einzelnes element (also die json sieht wie folgt aus {...}) oder mehrere Elemente (und das json sieht wie folgt aus [{...},{...}]) -
Sie müssen check-in Laufzeit den Typ des Elements.
Sollte es so Aussehen:
(Hinweis: in diesem code-Beispiel bin ich mit com.fasterxml.jackson)
InformationsquelleAutor Naor Bar
Ich hatte dieses Problem auf einer REST-API, die erstellt wurde, mithilfe des Spring framework. Hinzufügen eines @ResponseBody annotation (um die Antwort JSON) gelöst.
InformationsquelleAutor Do Will
Normalerweise stellen uns diesem Problem, wenn es ein problem gibt, das mapping von JSON-Knoten mit, dass der Java-Objekt. Ich Stand vor dem gleichen Problem, weil in der Arroganz der Knoten wurde definiert als der Typ array ist und das JSON-Objekt war nur ein element , daher wurde das system Schwierigkeiten in der Zuordnung ein element der Liste in ein array.
Swagger In das element definiert wurde, als
Während es sein sollte
Sowie
TestNew
sollte vom Typ arrayInformationsquelleAutor Ambuj Sinha
Bezug auf Eugen ' s Antwort, die Sie lösen können diesem speziellen Fall durch die Erstellung einer wrapper-POJO-Objekt, das enthält eine
Collection<COrder>
wie seine member-Variablen. Dies wird ordnungsgemäß guide Jackson zu Ort, die eigentlicheCollection
Daten innerhalb der POJO ' s member-variable und erzeugen von JSON, die Sie suchen in der API-Anforderung.Beispiel:
Dann setzen Sie den parameter Typ der
COrderRestService.postOrder()
zu Ihrem neuenApiRequest
wrapper POJO stattCollection<COrder>
.InformationsquelleAutor Adil B