Spring rest json post null值

时间:2017-04-12 15:11:30

标签: java json spring rest

我有一个Spring休息端点做一个简单的hello应用程序。它应该接受{"名称":"某事"}并返回"你好,某事"。

我的控制器是:

@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());
    }

}

人:

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;
    }
}

当我向

这样的服务提出请求时
curl -X POST -d '{"name": "something"}' http://localhost:8081/testapp/greeting

我得到了

Hello, World!

看起来它没有正确地将json反序列化为Person对象。它使用默认构造函数,然后不设置名称。我找到了这个:How to create a POST request in REST to accept a JSON input?所以我尝试在控制器上添加一个@RequestBody,但这导致了一些关于"内容类型' application / x-www-form-urlencoded; charset = UTF-8& #39;不支持"。我在这里看到了这一点:Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported for @RequestBody MultiValueMap建议删除@RequestBody

我尝试删除它不喜欢的默认构造函数。

此问题涵盖空值REST webservice using Spring MVC returning null while posting JSON,但它建议添加@RequestBody,但与上述内容有冲突......

2 个答案:

答案 0 :(得分:10)

您必须设置@RequestBody告诉Spring应该使用什么来设置person参数。

 public Greeting greeting(@RequestBody Person person) {
    return new Greeting(counter.incrementAndGet(), String.format(template, person.getName()));
} 

答案 1 :(得分:1)

您必须使用 @RequestMapping(value =“/ greeting”,method = RequestMethod.POST)设置“生成

使用下面的代码

@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());
    }