Java RequestBody的Spring REST始终为空

Java RequestBody的Spring REST始终为空,java,json,spring,rest,put,Java,Json,Spring,Rest,Put,因此,在修复了“415介质不受支持”错误()之后,我遇到了一个新问题。我的RequestBody始终为空。当我通过Chrome PostMan发送请求时,我总是返回一个只有空值的序列化实体。我正在我的项目中使用Spring(4.2.3.RELEASE)、jacksondatabind(2.6.3)和jacksoncore(2.6.3)。我在我的项目中使用基于注释的配置(@EnableWebMvc使spring自动发现HTTPMessageConverters) 其他帖子 我知道其他关于stac

因此,在修复了“415介质不受支持”错误()之后,我遇到了一个新问题。我的
RequestBody
始终为空。当我通过Chrome PostMan发送请求时,我总是返回一个只有空值的序列化实体。我正在我的项目中使用
Spring(4.2.3.RELEASE)
jacksondatabind(2.6.3)
jacksoncore(2.6.3)
。我在我的项目中使用基于注释的配置(
@EnableWebMvc
使spring自动发现
HTTPMessageConverters


其他帖子

我知道其他关于stackoverflow的帖子也有类似的问题。但他们没有给我一个答案。另外,大多数帖子都是针对较旧的Spring版本(4.0之前),所以现在有些东西已经完全不同了

类似职位:


弹簧控制器

在我的Spring
@RestController
中,我有以下代码:

@RequestMapping(value = "/location/update/{id}", method = RequestMethod.PUT)
public UserLocation updateUserLocation(@PathVariable("id") int id, UserLocation user) {        
        return user;        
}
我使用一个单独的模型类(
UserLocation
)进行数据绑定。这是因为这样我可以更好地控制API发送和接收的数据


数据绑定类(用户位置)

UserLocation类由3个属性组成,其中包含一个构造函数以及所需的getter和setter。(我可以公开这些属性,但我首先要解决这个问题)


JSON正文

通过AngularJS Ajax调用(
$http.PUT
),我使用以下数据调用spring控制器:

 {
    "latitude": 52.899370,
    "longitude": 5.804548,
    "lastActive": 1449052628407
 }

邮差请求

我正在开发一个Cordova应用程序,因此为了测试请求而无需将我的应用程序构建到我的手机上,我使用了Chrome PostMan插件

我正在打以下电话:

URL:
http://server:port/app/location/update/1

方法:
PUT

标题:
内容类型:应用程序/json

正文:

{
    "latitude": 52.899370,
    "longitude": 5.804548,
    "timestamp": 1449052628407
}

请求结果

通过请求,我得到以下结果:

{"latitude":null,"longitude":null,"lastActive":null}
这意味着Spring确实创建了my
UserLocation
类的一个新实例,但它没有用主体中的数据填充它


弹簧推杆法

在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媒体不受支持的错误,我似乎无法修复



已修复。下面的解决方案

我在控制器中没有看到UserLocation对象的@RequestBody?还要确保属性具有getter和setter

public UserLocation updateUserLocation(@PathVariable("id") int id, UserLocation user) {        

在执行HTTP PUT时,您必须添加额外的逻辑以将对象持久化到数据库。您需要调用DAO或存储库来持久化对象。通常,将传入的UserLocation对象映射到持久化的真实JPA/Hibernate实体。这不会自动发生。

问题是您没有用
@RequestBody

..updateUserLocation(@PathVariable("id") int id, @RequestBody UserLocation user)

还要确保为
UserLocation
memeber变量生成
getter
setter

我认为这与问题无关,但是对于邮递员,您发送的是
“latitude”
而不是
“latitude”
“timestamp”
,而不是
“lastActive”
@francescoforesti,谢谢你的介绍。我想我已经改变了。我会在邮局换的。(代码已经更新)@wiseguy先生你的问题解决了吗?@TomSebastian,是的。在这种情况下,Driss Amri和你们都给出了解决方案。在这里可以找到完整的解决方案,这可能不是一个答案,但我认为如果您将Lombok与IntelliJ一起使用,并且存在此问题,则可能会有所帮助。对我来说,之所以会发生这种情况,是因为我使用了Lombok和@Data注释,这意味着getter和setter应该隐式生成,但它们不是。龙目山没有把它做好。我尝试显式添加getters/setters方法,它可以工作。'@RequestBody'自从引入'@RestController'(Spring 4.0)后就不再是必需的了。我返回了Spring为我创建的UserLocation实例。这将导致一个空的JSON字符串(参见我的文章)。谢谢你提供关于坚持的信息。那么我仍然需要实现该代码。据我所知,@RequestBody不是可选的。我想你把它和@ResponseBody混淆了?添加@RequestBody会让我回到原来的问题。这会引发415媒体不受支持错误。您是否正在使用postman发送“Content-Type:application/json”标头?每个@RequestBody bean都必须实现Serilizable接口。
..updateUserLocation(@PathVariable("id") int id, @RequestBody UserLocation user)