Suresh A
Suresh A

Reputation: 1188

JSON data binding in spring mvc

I have received json data from android application in my Spring MVC controller using following code .

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RequestHeader;

@RequestMapping(method = RequestMethod.POST, produces = "application/json")
public @ResponseBody String getMethod(@RequestHeader(value="json") String    
headerStr) {
System.out.println("POST");
System.out.println(headerStr);
return "hello";
}

The output of System.out.println(headerStr) is as

{"action":"check_login","password":"test","username":"test"}

But i want to bind this json data to following class.

public class LoginRequest {
private String action;
private String username;
private String password;

public String getAction() {
return action;
}

public void setAction(String action) {
this.action = action;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

in my POM.xml

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.1</version>
</dependency>

Following is my android code

    HttpParams httpParams = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
    HttpConnectionParams.setSoTimeout(httpParams, 5000);
    HttpClient httpclient = new DefaultHttpClient(httpParams);
    HttpPost httppost = new HttpPost( "http://localhost:8080/datarequest");
    JSONObject json = new JSONObject();


        json.put("action", "check_login");
        json.put("username","name");
        json.put("password", "password");


    JSONArray postjson = new JSONArray();
    postjson.put(json);

    httppost.setHeader("json", json.toString());
    httppost.getParams().setParameter("jsonpost", postjson);

    System.out.println(postjson);
    HttpResponse response = httpclient.execute(httppost);

How to solve this problem?

Upvotes: 9

Views: 5290

Answers (2)

Stefan
Stefan

Reputation: 12463

Use the Jackson ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
LoginRequest login = mapper.readValue(headerStr, LoginRequest.class);

Upvotes: 2

Master Slave
Master Slave

Reputation: 28539

You should change the arguments in your method to

public @ResponseBody String getMethod(@RequestBody LoginRequest loginRequest) 

this way the LoginRequest class will be instantiated and bound to json value where keys match the property

Also, make sure that you send the json as part of the body, add the following

StringEntity se = new StringEntity(json.toString(), "UTF8");  
se.setHeader("Content-type", "application/json");
post.setEntity(se);

before the HttpResponse response = httpclient.execute(httppost); line

Upvotes: 9

Related Questions