user3242743
user3242743

Reputation: 1851

Spring : Responding to a REST-ful API call

I am trying to implement REST API endpoints in y application.

@Controller
 public class HerokuController {

    @RequestMapping(value = "/heroku/resources/", method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE)
    public  ResponseEntity<JSONObject> provision(@RequestBody JSONObject body){
        System.out.println("called! \n");
        JSONObject response = new JSONObject();
        response.put("id", 555);
        response.put("message", "Provision successful!");
          return new ResponseEntity<JSONObject>(response,HttpStatus.OK);        
    }

So I wrote this class containing a method which mapping is (heroku/ressources). But when I try to call it, I get a 404 error because /WEB-INF/heroku/resources.jsp not found. However, I don't even want to get a view but a HTTP response.

Can anyone tell me which configuration file should we generally modify to tell Spring that this controller doesn't want to send back a view but a HTTP response?

The method is however called if I change it to this :

@RequestMapping(value = "/heroku/resources/", method = RequestMethod.POST)
    public  ModelAndView provision(final HttpServletRequest request){
            System.out.println("called! \n");
            JSONObject response = new JSONObject();
            response.put("id", 555);
            response.put("message", "Provision successful!");
            final Map<String, Object> result = new HashMap<String, Object>();
          return new ModelAndView("jsonView",result);   
    }

So changing the return type to "ModelAndView".

thanks.

Upvotes: 0

Views: 2815

Answers (2)

nicearma
nicearma

Reputation: 780

I had the same problem once, for fix that you can use @RestController instead of @controller (this will send Json by default) and you can definy your method like this

@RequestMapping(value = "/heroku/resources/", method = RequestMethod.POST)
public JsonOut provision(@RequestBody JsonIn json)

I always made my object with the value that i will get from the client, and alway the definition of the output

Ex

public class JsonOut{

    protected String id;
    protected String message;

    ...set ....get

}

and you have to put in the spring xml file this two value

<mvc:annotation-driven />

<context:annotation-config/> 

With this configuration you will have json always!

This will work with spring 4, i dont know if with spring 3 will work

Upvotes: 0

Alex
Alex

Reputation: 25613

You are missing the @ResponseBody

@RequestMapping(value = "/heroku/resources/", method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody ResponseEntity<JSONObject> provision(@RequestBody JSONObject body){
    System.out.println("called! \n");
    JSONObject response = new JSONObject();
    response.put("id", 555);
    response.put("message", "Provision successful!");
      return new ResponseEntity<JSONObject>(response,HttpStatus.OK);        
}

Upvotes: 2

Related Questions