Mr Morgan
Mr Morgan

Reputation: 2243

HTTP GET issue when processing JSON returned from REST Spring MVC method

I have a method in a Spring MVC controller as follows:

// Gets a Person via REST.

@RequestMapping(value="/person/{personId}", method=RequestMethod.GET)
public ModelAndView getPerson(@PathVariable("personId") String personId) {

    logger.info(RestController.class.getName() + ".getPerson() method called."); 

    Person person = personService.get(Integer.parseInt(personId));
    return new ModelAndView(view,"person", person);        
} 

The method is working correctly but in the code to process the JSON on the client, I get the following exception:

Unrecognized field "person" (class libraryApp.model.Person), not marked as ignorable (6 known properties: , "personId", "address", "telephone", "books", "name", "email"])

The code is below:

// Set request.
        String url = ("http://localhost:8080/Library/rest/person/1");      
        HttpGetRequest httpGetRequest = new HttpGetRequest(url, "GET", ""); 

        // Make request.
        httpGetRequest.get();

// Get response.        
        if (httpGetRequest.getResponseCode() != 200) {                  
            throw new RuntimeException("Get request failed: HTTP error code: " + httpGetRequest.getResponseCode());
        } 
        else {                                      

            // Receive JSON from server and convert to Person.
            ObjectMapper mapper = new ObjectMapper(); 
            Person person = mapper.readValue(httpGetRequest.getResponse(), Person.class);
            System.out.println("Person:");
            System.out.println(person.toString());
            if (! (person.getBooks().isEmpty())) {
                System.out.println("Books:");
                for (Book book : person.getBooks()) {
                    System.out.println(book.toString());
                }
            }
        }

Person is a simple POJO as follows:

public class Person implements Serializable {

// Attributes.        
private Integer personId;        
private String name;  
private String address;   
private String telephone;       
private String email;        
private List<Book> books;

I am using ModelAndView constructor, ModelAndView(String viewName, String modelName, Object modelObject). So according to the JavaDoc I have to specify a modelName but how can I deal with this on the client?

Now I am getting no response on the client from the following if I use a class called Messages in the following code:

ObjectMapper mapper = new ObjectMapper(); 
            Object obj =  mapper.readValue(httpGetRequest.getResponse(), Object.class);
            if (obj instanceof Messages) {
              Messages m = (Messages) obj;
              for (String s : m.getMessages())
                  System.out.println("Here " + s);


            }

Messages is a utility class:

public class Messages {

private List<String> messages;

public Messages() { 
    messages = new ArrayList<String>();
}

With the controller method now:

@RequestMapping(value="/person/{personId}", method=RequestMethod.GET)

@ResponseBody public String getPerson(@PathVariable("personId") String personId) {

logger.info(RestController.class.getName() + ".getPerson() method called."); 

Person person = personService.get(Integer.parseInt(personId));

ObjectMapper mapper = new ObjectMapper();
try {
    Messages m = new Messages();
    m.addMessage("SDGSFGSDFGSDFASDG");
    return mapper.writeValueAsString(m);
    // return mapper.writeValueAsString(person);
}
catch (JsonProcessingException ex) {

        return null;
 }

}

Logging the client, I get:

Sending Get request: http://localhost:8080/Library/rest/person/1.

Receiving response code: 200. {messages=[SDGSFGSDFGSDFASDG]}

Upvotes: 1

Views: 1534

Answers (1)

Nikhil Talreja
Nikhil Talreja

Reputation: 2774

If there is no re-direction from your GET call, try this:

@RequestMapping(value="/person/{personId}", method=RequestMethod.GET)
@ResponseBody
public String getPerson(@PathVariable("personId") String personId) {

    logger.info(RestController.class.getName() + ".getPerson() method called."); 

    Person person = personService.get(Integer.parseInt(personId));

    ObjectMapper mapper = new ObjectMapper();
    return mapper.writeValueAsString(person);

}

Make sure you Messages class is also a POJO

public class Messages implements Serializable{

private List<String> messages;

//setters and getters for messages

}

Upvotes: 1

Related Questions