所以在我修复了'415 media not supported'错误(415 media not supported)之后,我遇到了一个新问题。我的RequestBody
始终为空。当我通过 Chrome PostMan 发送请求时,我总是会返回一个只有空值的序列化实体。我在项目中使用Spring (4.2.3.RELEASE)
,Jackson-databind (2.6.3)
和jackson-core (2.6.3)
。我在项目中使用基于注释的配置(@EnableWebMvc
使spring自动发现HTTPMessageConverters
)。
其他帖子
我知道stackoverflow上的其他帖子,几乎同样的问题。但他们没有给我答案。此外,大多数帖子都是针对较旧的Spring版本(4.0之前的版本),所以现在有些东西完全不同了。
类似帖子:
@RepsonseBody is always empty in Spring
Spring's @RequestBody providing empty string on POST
Using HttpServletRequest request
Spring控制器
在我的春天@RestController
我有以下代码:
@RequestMapping(value = "/location/update/{id}", method = RequestMethod.PUT)
public UserLocation updateUserLocation(@PathVariable("id") int id, UserLocation user) {
return user;
}
我使用单独的模型类(UserLocation
)进行数据绑定。这是因为这样我可以更好地控制我的API发送和接收的数据。
数据绑定类(UserLocation)
UserLocation类包含3个属性,包含构造函数和所需的getter和setter。 (我可以公开这些属性,但我首先想解决这个问题。)
public class UserLocation {
private Float latitude;
private Float longitude;
private Date lastActive;
}
JSON正文
通过我的AngularJS Ajax调用($http.PUT
)我使用以下数据调用spring控制器:
{
"latitude": 52.899370,
"longitude": 5.804548,
"lastActive": 1449052628407
}
PostMan请求
我正在开发Cordova应用程序,所以为了测试请求而不需要将我的应用程序构建到我的手机上,我使用 Chrome PostMan插件。
我正在拨打以下电话:
URL:
http://server:port/app/location/update/1
Method:
PUT
Headers:
Content-Type: application/json
Body:
{
"latitude": 52.899370,
"longitude": 5.804548,
"timestamp": 1449052628407
}
请求结果
根据请求,我得到以下结果:
{"latitude":null,"longitude":null,"lastActive":null}
这意味着Spring确实创建了我的UserLocation
类的新实例,但它没有用正文中的数据填充它。
Spring PUT方法
在Spring控制器中使用PUT方法时,是不是立即更新了实体?那么这意味着控制器中没有额外的逻辑来更新实体吗? (如果实体当然是 Hibernate / JPA 模型,可以更新)。
我似乎无法弄清楚问题所在。谁知道我做错了什么?
更新
将@RequestBody
添加到我的控制器代码中:
@RequestMapping(value = "/location/update/{id}", method = RequestMethod.PUT)
public UserLocation updateUserLocation(@PathVariable("id") int id, @RequestBody UserLocation user) {
return user;
}
让我回到原来的问题(415 media not supported)。添加此操作会抛出415 Media不支持的错误,我似乎无法修复。
固定。解决方案
答案 0 :(得分:6)
我在Controller中看不到UserLocation对象的@RequestBody?还要确保你的属性有getter和setter。
public UserLocation updateUserLocation(@PathVariable("id") int id, UserLocation user) {
在执行HTTP PUT时,您必须添加额外的逻辑来将对象持久保存到数据库中。您需要调用DAO或Repository来保留对象。通常,您将传入的UserLocation对象映射到您持久存在的真实JPA / Hibernate实体。这不会自动发生。
答案 1 :(得分:5)
问题是您错过了使用@RequestBody
..updateUserLocation(@PathVariable("id") int id, @RequestBody UserLocation user)
同时确保为getters
个memeber变量生成setters
和UserLocation
。