Spring rest json post null values
我有一个Spring Rest端点在做一个简单的Hello应用程序。它应该接受"name":"something"并返回"hello,something"。
我的控制器是:
1 2 3 4 5 6 7 8 9 10 11
| @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());
}
} |
人:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 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 ;
}
} |
号
当我向服务机构提出请求时
1
| curl -X POST -d '{"name":"something"}' http://localhost:8081/testapp/greeting |
我得到
。
看起来它没有将JSON反序列化到Person对象中。它使用的是默认的构造函数,然后不设置名称。我发现了这一点:如何在REST中创建一个POST请求来接受JSON输入?所以我尝试在控制器上添加一个@requestbody,但是这会导致一些关于"content type"应用程序的错误/x-www-form-urlencoded;charset=utf-8'不受支持。我看到这里介绍了:content-type'application/x-www-form-urlencoded;charset=utf-8'不支持@requestbody多值映射,它建议删除@requestbody
我已经尝试删除它也不喜欢的默认构造函数。
这个问题涉及使用SpringMVC的空值RESTWebService,在发布JSON时返回空值,但它建议添加@requestbody,但与上面的冲突…
您必须设置@RequestBody来告诉spring应该使用什么来设置您的person参数。
1 2 3
| public Greeting greeting (@RequestBody Person person ) {
return new Greeting (counter. incrementAndGet(), String. format(template, person. getName()));
} |
- 正如我在描述中所说,这会导致"内容类型"应用程序/x-www-form-urlencoded;charset=utf-8"不受支持"
- 你的内容类型应该是Content type 'application/json。
- 您可以使用Postman或其他JSON客户机来测试您的应用程序,我可能会更容易。
- x-www-form-urlencoded有什么问题?
- 没什么错,只是不是预期的内容类型
- 有没有办法让它与该内容类型一起工作?
- 是的,但是你不应该禁用控件,你应该把好的信息发送到你的应用程序。顺便说一下,如果您喜欢禁用控件,请尝试@pranaykumbhalkar advice。
- 关键是,已经有客户机向使用该内容类型的旧版本发送内容。我需要能够处理它们直到它们升级。无论如何,使用所有价值的东西都是行不通的。
- ALL_VALUE将不起作用,因为您的旧发送方发送的JSON数据没有告诉接收者它是JSON,所以接收者将不知道如何处理数据,因为声明的数据类型(即内容类型)与数据传输不对应。
必须使用@requestmapping设置'products'(value="/greeting",method=requestmethod.post)
使用以下代码
1 2 3 4
| @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());
} |
号
- "产生"是指响应。反应不错。另外,因为它返回的是纯字符串,所以它应该是mediatype.text_plain_value
- try"consumes=mediatype.all_value"
- @Pranaykumbhalkar,consumes = MediaType.ALL_VALUE不是一个解决方案。如果您无法通过检查,解决方案不会禁用检查;解决方案会更改您发送的内容。