2014-04-05 14 views
6

Tôi đã thực hiện một số nghiên cứu trên web liên quan đến vấn đề của mình, và tôi cảm thấy rằng mã của tôi phản ánh những gì được viết trong hầu hết các ví dụ - tuy nhiên, nó vẫn không hoạt động. Vì vậy, câu hỏi của tôi.angularjs + spring mvc + json post request

Ngắn câu chuyện, tôi muốn gửi yêu cầu POST để thêm mục mới vào một số "chương trình phụ trợ". Đối với REST API tôi sử dụng Spring MVC, để gửi yêu cầu tôi sử dụng $ http từ AngularJS

Đó là cách tôi gọi yêu cầu 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}); 
    }) 
} 

Những bản đồ đến URL thích hợp. Vấn đề là tôi nhận được phản hồi sau đây

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

Tôi gặp lỗi này khi tôi nhấp vào nút trên trang web và khi tôi thử nghiệm qua một số khách hàng REST.

Dependencies Tôi đã bao gồm trong pom.xml của tôi

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

Một lưu ý - gửi yêu cầu khác thông qua công trình GET.

My điều khiển lớp

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

} 

Bất kỳ manh mối?

EDIT

Sau khi thêm chế độ gỡ lỗi có vẻ như đó là một số JSON phân tích vấn đề

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

Dường như nó hoạt động, vấn đề là nó chỉ hỗ trợ "(dấu ngoặc kép) nơi tôi muốn sử dụng các dấu nháy đơn. Có lý do gì để tôi phải báo giá gấp đôi khi thực hiện JSON không?

Và những gì tôi nên làm thay đổi mặc định aviour của trình ánh xạ JSON?

Trả lời

0

Bạn có thể thiếu hàm tạo mặc định trong miền PollItem của mình.

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

Thêm mã này và mã của bạn sẽ hoạt động tốt.

Bạn đã có một hàm tạo được định nghĩa trong PollItem, mà làm cho nó trở thành hàm tạo mặc định. Vì vậy, việc thêm hàm tạo giả sẽ giải quyết vấn đề của bạn

+0

Mặc định constructor thêm - vẫn không hoạt động:/ – amerykanin

+0

bạn có thể vui lòng kiểm tra log máy chủ của bạn. Nên có một số thông báo liên quan đến yêu cầu xấu này. Nếu bạn có thể đăng nó, tôi có thể giúp bạn thêm. – sharifahmed

+0

Tôi đang chạy nó qua mvn -X jetty: chạy để xem một số thông tin gỡ lỗi, nhưng đáng tiếc không có gì xuất hiện khi tôi đang cố gắng truy cập phương thức POST:/ – amerykanin

3

Ok, để trả lời câu hỏi - vấn đề là tôi đã sử dụng JSON được định dạng sai. Tôi nên sử dụng dấu ngoặc kép thay vì dấu nháy đơn (về cơ bản là theo tiêu chuẩn JSON. Tôi mới làm điều này và tôi hơi bối rối vì nhiều trang web sử dụng dấu nháy đơn cho ví dụ của họ - chẳng hạn như biểu đồ google ví dụ).

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

là tốt

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

xấu :)

3

Đó là sự thật nếu JSON của bạn không được ánh xạ một cách chính xác với đối tượng phía máy chủ sau đó nó sẽ ném ngoại lệ. Tôi thấy rất thoải mái ví dụ đơn giản ở đây làm việc chính xác những gì bạn đang tìm kiếm:

AngularJS Post Spring MVC JSON Example

AngularJS Form Post Spring MVC JSON

+1

Vui lòng xem xét thêm các ví dụ mã trong câu trả lời của bạn, vì liên kết bị thối :) –

Các vấn đề liên quan