angularjs + spring mvc + json-post request
Ich habe getan, einige der Forschung auf dem web in Bezug auf mein problem, und ich habe das Gefühl, dass mein code spiegelt das, was in den meisten der Beispiele - und doch, es funktioniert immer noch nicht. Daher meine Frage.
Lange Geschichte kurz, ich möchte zum senden von POST-Requests auf neues Element hinzufügen, um einige "backend". Für die REST-API, die ich verwenden, Spring MVC, der für das senden der Anfrage, die ich verwenden $http von AngularJS
Das ist, wie rufe ich den POST-request
$scope.testAddItem = function(){
$http({
'url' : 'addNewItem',
'method' : 'POST',
'headers': {'Content-Type' : 'application/json'},
'data' : $scope.newItem
}).success(function(data){
$scope.marketForm.texts.push({'text' : data.text});
})
}
Welche Karten auf die richtige URL. Problem ist, dass ich die folgende Antwort
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<title>Error 400 BAD_REQUEST</title>
</head>
<body><h2>HTTP ERROR 400</h2>
<p>Problem accessing /poll/addNewItem/. Reason:
<pre> BAD_REQUEST</pre></p><hr /><i><small>Powered by Jetty://</small></i><br/>
Ich bekomme diese Fehlermeldung, entweder wenn ich auf den button auf der website, und wenn ich Teste es über einige REST-Client.
Abhängigkeiten ich habe in meinem pom.xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
Einen Hinweis senden - andere-Anfrage über GET funktioniert.
Meine Controller-Klasse
@Controller
@RequestMapping(value = "/")
public class PollController {
@RequestMapping(method = RequestMethod.GET)
public String mainPage(){
return "poll";
}
@RequestMapping(value = "/getNewElement")
public @ResponseBody
List<PollItem> getNewElement(){
List<PollItem> listOfItems = new ArrayList<PollItem>(2);
listOfItems.add(new PollItem("test 1"));
listOfItems.add(new PollItem("test 2"));
return listOfItems;
}
@RequestMapping(value = "/addNewItem", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody PollItem addNewElement(@RequestBody PollItem pollItem){
pollItem.setId(2); //I know it makes no logical sense, but it's just for testing.
return pollItem;
}
}
Irgendwelche Hinweise ?
BEARBEITEN
Nach dem hinzufügen der debug-Modus scheint es, dass es einige JSON-parsing-problem
Method [public com.poll.model.PollItem com.poll.controller.PollController.addNewElement(com.poll.model.PollItem)]
org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unexpected character ('a' (code 97)): expected a valid value (number, String, arr
ay, object, 'true', 'false' or 'null')
at [Source: HttpInputOverHTTP@5ce15706; line: 1, column: 2]; nested exception is org.codehaus.jackson.JsonParseException: Unexpected character ('a' (code 97)): expected
a valid value (number, String, array, object, 'true', 'false' or 'null')
at [Source: HttpInputOverHTTP@5ce15706; line: 1, column: 2]
at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readJavaType(MappingJacksonHttpMessageConverter.java:187)
at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.read(MappingJacksonHttpMessageConverter.java:179)
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodAr
gumentResolver.java:138)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:183)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:98)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:79)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:157)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:124)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:738)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:551)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:568)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1111)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:478)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1045)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:199)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
at org.eclipse.jetty.server.Server.handle(Server.java:462)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:279)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:232)
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:534)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536)
at java.lang.Thread.run(Thread.java:724)
Caused by: org.codehaus.jackson.JsonParseException: Unexpected character ('a' (code 97)): expected a valid value (number, String, array, object, 'true', 'false' or 'null'
)
at [Source: HttpInputOverHTTP@5ce15706; line: 1, column: 2]
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1433)
at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:521)
at org.codehaus.jackson.impl.JsonParserMinimalBase._reportUnexpectedChar(JsonParserMinimalBase.java:442)
at org.codehaus.jackson.impl.Utf8StreamParser._handleUnexpectedValue(Utf8StreamParser.java:2090)
at org.codehaus.jackson.impl.Utf8StreamParser._nextTokenNotInObject(Utf8StreamParser.java:606)
at org.codehaus.jackson.impl.Utf8StreamParser.nextToken(Utf8StreamParser.java:492)
at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2770)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2718)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1923)
at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readJavaType(MappingJacksonHttpMessageConverter.java:184)
... 38 more
EDIT2
Es scheint, dass es funktioniert, problem ist, dass es unterstützt nur " (doppelte Anführungszeichen), wo will ich einfache Anführungszeichen verwenden. Gibt es einen Grund, warum ich Anführungszeichen immer, wenn man JSON?
Ist und was ich tun soll, ändern Sie Standard-Verhalten von JSON-mapper?
InformationsquelleAutor amerykanin | 2014-04-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, um die Frage zu beantworten - Problem war, dass ich verwendet, schlecht formatierte JSON. Ich sollte mit doppelte Anführungszeichen statt Anführungszeichen (das ist im Grunde das folgende JSON-standard. Ich bin neu hier, und ich war ein wenig verwirrt, weil eine Menge von websites verwendet einfache Anführungszeichen für Ihre Beispiele - wie z.B. google charts ).
ist gut
ist bad🙂
InformationsquelleAutor amerykanin
Das ist wahr, wenn Ihr JSON nicht richtig zugeordnet mit server-side object, dann wird es Ausnahme auslösen. Fand ich sehr schön, einfaches Beispiel hier, arbeiten genau das, was Sie suchen:
AngularJS Post Spring MVC, JSON Beispiel
AngularJS Formular-Post Spring MVC, JSON
InformationsquelleAutor John Doe
Möglicherweise fehlt der default-Konstruktor im PollItem domain.
Hinzufügen, der code funktioniert wunderbar.
Haben Sie schon ein Konstruktor definiert, in PollItem, wodurch es den default-Konstruktor. Also das hinzufügen des dummy-Konstruktor wird Ihr problem lösen
Können Sie bitte überprüfen Sie Ihre server-log. Es sollte einige Nachrichten über dieses bad request. Wenn du ihn posten kannst, kann ich dir weiter helfen.
Bei mir läuft es über mvn -X jetty:run, um zu sehen, einige debug-Informationen, aber leider kommt nichts, wenn ich versuche, Zugriff auf die POST-Methode :/
Hinzugefügt einige DEBUG-info
Es ist ein miss-match zwischen den json-Daten, die Sie senden und Ihre POJO. Das ist der Grund, warum Jackson nicht in der Lage, anzeigen von json zu pojo. Überprüfen Sie Ihre json-Daten mit Firebug/Entwicklertools mit Ihrem Pojo-Struktur. Wenn du die json-und pojo kann ich einen Blick, wie gut.
InformationsquelleAutor sharifahmed