2014-04-05 11 views
6

Zrobiłem kilka badań w Internecie dotyczących mojego problemu i czuję, że mój kod odzwierciedla to, co jest napisane w większości przykładów - a jednak nadal nie działa. Tak więc moje pytanie.angularjs + spring mvc + json post request

Krótko mówiąc, chcę wysłać żądanie POST, aby dodać nowy element do jakiegoś "zaplecza". REST API dla Używam MVC wiosny, do wysyłania żądania używam $ http z angularjs

Tak właśnie wywołać żądania POST

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

który odwzorowuje do prawidłowego adresu URL. Problem polega na tym, że mam następującą odpowiedź

<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/> 

dostaję ten błąd albo po kliknięciu przycisku na stronie, a gdy jestem testowania go przez jakiś odpoczynek Klienta.

Zależności podaję w moim 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> 

Jedna uwaga - podając inny wniosek za pośrednictwem dzieł GET.

klasa mojego kontrolera

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

} 

Wszelkie wskazówki?

EDIT

Po dodaniu tryb debugowania wydaje się, że to jakiś JSON parsowania problemem

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: [email protected]; 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: [email protected]; 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: [email protected]; 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

Wydaje się, że to działa, problemem jest to, że obsługuje tylko "(cudzysłów) gdzie chcę używać pojedynczych cudzysłowów.Czy jest jakiś powód, dla którego powinienem podwójnie cytować zawsze kiedy robię JSON?

I co powinienem zrobić zmienić domyślny beh Aviour mapper JSON?

Odpowiedz

0

Być może brakuje domyślnego konstruktora w domenie PollItem.

public class PollItem { 
    public PollItem() { 
    } 
    //your rest of the codes 
} 

Dodaj to i twój kod będzie działał dobrze.

Masz już zdefiniowany konstruktor w PollItem, który czyni go domyślnym konstruktorem. W związku z tym dodanie konstruktora fikcyjnego rozwiąże Twój problem

+0

Domyślny konstruktor dodał - nadal nie działa:/ – amerykanin

+0

Czy należy sprawdzić logi serwera. Powinno być kilka wiadomości dotyczących tego złego żądania. Jeśli możesz to opublikować, pomogę ci dalej. – sharifahmed

+0

Używam go przez mvn -X Mijak: uruchom, aby zobaczyć niektóre informacje debugowania, ale niestety nic nie pojawia się, gdy próbuję uzyskać dostęp do metody POST:/ – amerykanin

3

OK, aby odpowiedzieć na pytanie - problem polegał na tym, że użyłem źle sformatowanego JSON. Powinienem używać podwójnych cudzysłowów zamiast pojedynczych cudzysłowów (co jest w zasadzie zgodne z normą JSON.) Jestem nowy w tym i byłem trochę zdezorientowany, ponieważ wiele stron internetowych wykorzystuje pojedyncze cytaty dla swoich przykładów - jak na przykład wykresy google).

{"id":10,"text":"smth smth"} 

jest dobre

{'id':10,'text':'smth smth'} 

jest złe :)

3

To prawda, jeśli JSON nie jest odwzorowane prawidłowo z obiektu po stronie serwera, a następnie będzie rzucać wyjątek. Znalazłem bardzo ładny prosty przykład tutaj pracuje dokładnie to, czego szukasz:

AngularJS Post Spring MVC JSON Example

AngularJS Form Post Spring MVC JSON

+1

Proszę wziąć pod uwagę dodawanie przykładów kodu w swoich odpowiedziach, ponieważ łącza zgniją :) –