Question

Hello StackOverFlow(s)

I'm running with this issue since more than 2 hours now It's simple

I'm trying to send a JSON object to a Spring Controller by using a $.ajax POST call

I'm using AngularJS but that point is okey

here's the code of both server and client and the spring configuration

Thank's in advance

JQuery :

    $scope.push = function() {
    $.ajax({
        type: "PUT",
        url:"rest/todo/greeting/",
        data : {id:"1",title:"ajax",description:"ajax"},
        dataType: "json",
        contentType : "application/json",
        success : function(data) {
            $log.info(data)
        }
    })
}

Spring Controller :

@Controller
@RequestMapping("/todo")
public class TodoController {
@RequestMapping(value = "/greeting", method = RequestMethod.PUT,consumes="application/json",produces="text/html")
public @ResponseBody String push(@RequestBody Todo todo) {
    System.out.println(todo.getTitle());
    return "test";
}

}

Spring Configuration :

<mvc:annotation-driven />
<context:component-scan base-package="org.lab.todo.controller" />
<bean id="defaultViews" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />

web.xml :

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

<!--
    Spring WEBMVC/REST Controllers
-->
<servlet>
    <servlet-name>todo-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>todo-dispatcher</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

Ajax Call Update :

    $scope.push = function() {
    var jsonString = {id:"1",title:"ajax",description:"ajax"};
    var Todo = function(){}
    Todo.id = "id";
    Todo.title = "ajax";
    Todo.description = "ajax";
    $.post("rest/todo/greeting",JSON.stringify(Todo),function(response){console.log(response)},'json');
}

Fiddle Raw Request Header :

POST http://localhost:8080/todo-rest/rest/todo/greeting HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 0
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://localhost:8080
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko)     Chrome/24.0.1312.56 Safari/537.17
Referer: http://localhost:8080/todo-rest/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,fr;q=0.6
Accept-Charset: UTF-8,*;q=0.5

Fiddle Response Header

HTTP/1.1 415 Unsupported Media Type
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1048
Date: Thu, 31 Jan 2013 17:11:40 GMT
Was it helpful?

Solution

Here's the answer

It's simply a matter of properly writing the JSON string

instead of

var jsonString = {id:"1",title:"ajax",description:"ajax"};

I wrote it like this

var jsonString = '{"id":"1","title":"ajax","description":"ajax"}';

what is still weird is that JSON.stringify(MyObject) seems not to work in my case !!

OTHER TIPS

If you're getting a 400 status code, it can only be for the following reason (from W3):

10.4.1 400 Bad Request

The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.

With Spring, this either means that the ajax request is wrong (see my comment about the data JSON string) or it can't parse and translate the JSON String in the request body to your command object Todo. So Spring has a method it can call, your push() method, but it doesn't have the parameter your are looking for to pass to it, so it throws a 400 Bad Request.

415 Unsupported Media Type means that Spring cannot find a method to consume what you are sending. Your push() Spring method consumes="application/json" but your request isn't using that content-type.

Could you post your web.xml? Since you're not defining a suffix for your request and place a slash in the end, you're doing a request to the index.jsp of that directory.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top