4

I have a list of string in my JavaScript code which I send via jQuery to a REST based service as follows:

var ids = []; 
$("input:checked").each(function() {
    ids.push(this.id);
});
var selectedIds = JSON.stringify(ids);
$.post("/todonotes/tasks/removeTask", selectedIds,function(e) {
}, "json");

As you can see, I convert a JavaScript array into a JSON array.

Now, in the server side, I use Spring MVC and Jackson to receive and parse the input JSON:

@RequestMapping(value="/tasks/removeTask", method = RequestMethod.POST)
public @ResponseBody String removeTask(@RequestBody List<String> selectedIds) {
    ...
}

But I always get:

HTTP Status 415 - 

--------------------------------------------------------------------------------

type Status report message 

description The server refused this request because the request entity is in a format     not supported by the requested resource for the requested method.

I tried to remove the quotes from the JSON object, and also tried using @RequestParam without success.

Update as per OQJF suggestion:

I modified my post request as follows:

$.post("/todonotes/tasks/removeTask", {selectedIds: selectedIds},function(e) {  
}, "json");

Now my controller method gets called, but each List element is populated with the double quotes and brackets. This the List argument:

[["15", "21"]]

So e.g. the first element looks like:

["15"

I would prefer not to parse each String element of the List.

I also tried removing the JSON.stringify conversion but my controller didn't even get called. With this I got:

HTTP Status 400 - Required List parameter 'selectedIds' is not present

--------------------------------------------------------------------------------

type Status report

message Required List parameter 'selectedIds' is not present

description The request sent by the client was syntactically incorrect.

Update

I tried to create an object to hold my ids, as follows:

public class TaskIdHolder {
    
    private String[] selectedIds;

    public String[] getSelectedIds() {
        return selectedIds;
    }

    public void setSelectedIds(String[] selectedIds) {
        this.selectedIds = selectedIds;
    }
}

Then I modified my controller method signature:

public @ResponseBody String removeTask(@RequestBody TaskIdHolder selectedIds) {

And my JSON request looks like this:

{"selectedIds":["15"]}

I also modified my jQuery code as per Andrei's suggestion:

var data = JSON.stringify({selectedIds:selectedIds});
$.post("/todonotes/tasks/removeTask", data, function(e) {

Where selectedIds is a JavaScript array.

But now I get:

POST http://localhost:8080/todonotes/tasks/removeTask 415 (Unsupported Media Type) 
2

3 Answers 3

4

As I know that you don't need to use JSON.stringify(), your code can be like this:

var ids = []; 
$("input:checked").each(function() {
    ids.push(this.id);
});

$.post("/todonotes/tasks/removeTask", $.param({'id': ids}, true),function(e) {
}, "json");

And on the server side, you should specify the value of:

public methodName(@RequestParam("id") List<String> selectedIds)
Sign up to request clarification or add additional context in comments.

Comments

3

Try the following, no need to change your controller's method signature or create an object to hold your ids.

$.post("/todonotes/tasks/removeTask", {selectedIds: selectedIds.join(',')},function(e) {  
}, "json");

That way you'll be sending your ids like selectedIds: id1,id2,id3 which is how the Controller is expecting them to be if you declare your request param to be String[] or List<String> (works for both scenarios).

Comments

2

Try giving the the request parameter an explicit name:

$.post("/todonotes/tasks/removeTask", {selectedIds: selectedIds},...

Update. You can also try to stringify the whole request data object to JSON:

var data = {selectedIds: selectedIds};
$.post("/todonotes/tasks/removeTask", JSON.stringify(data),...

3 Comments

Thanks. Got some progress. I still have some issues with the List argument. Please see my question updated.
@GonzaloGarciaLasurtegui, please have a look at the updated answer - this should help.
I tried this with @RequestBody annotation. Please see a new update in my question.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.