9

I have a Spring rest endpoint doing a simple hello app. It should accept a {"name":"something"} and return "Hello, something".

My controller is:

@RestController
public class GreetingController { 

    private static final String template = "Hello, %s!";

    @RequestMapping(value="/greeting", method=RequestMethod.POST)
    public String greeting(Person person) {
        return String.format(template, person.getName());
    }

}

Person:

public class Person {

    private String name;

    public Person() {
        this.name = "World";
    }

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

When I make a request to the service like

curl -X POST -d '{"name": "something"}' http://localhost:8081/testapp/greeting

I get

Hello, World!

Looks like it isn't deserializing the json into the Person object properly. It's using the default constructor and then not setting the name. I found this: How to create a POST request in REST to accept a JSON input? so I tried adding an @RequestBody on the controller but that causes some error about "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported". I see that is covered here: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported for @RequestBody MultiValueMap which suggests removing the @RequestBody

I have tried removing the default constructor which it doesn't like either.

This question covers null values REST webservice using Spring MVC returning null while posting JSON but it suggests adding @RequestBody but that conflicts with above...

2 Answers 2

17

You must set the @RequestBody to tell to Spring what should be use to set your personparam.

 public Greeting greeting(@RequestBody Person person) {
    return new Greeting(counter.incrementAndGet(), String.format(template, person.getName()));
} 
Sign up to request clarification or add additional context in comments.

9 Comments

As I said in my description, that results in a "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported"
Your Content type should be Content type 'application/json
You might use PostMan or some other Json client to test your app, i might be easier.
Nothing is wrong, it's just not the expected Content Type
Is there a way to make it work with that content-type?
|
0

You must set 'produces' with @RequestMapping(value="/greeting", method=RequestMethod.POST)

use below code

@RequestMapping(value="/greeting", method=RequestMethod.POST, produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE })
 public String greeting(@RequestBody Person person) {
        return String.format(template, person.getName());
    }

3 Comments

"produces" refers to the response. The response is fine. Also, since it's returning a plain string, it should be MediaType.TEXT_PLAIN_VALUE
try 'consumes = MediaType.ALL_VALUE'
@PranayKumbhalkar, consumes = MediaType.ALL_VALUE isn't a solution. If you can't pass through an check, the solution isn't disabling the check ; the solution is changing what you're sending.

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.