我正在开发一个网页应用程序与AngularJS和野生苍蝇使用Spring也。
我的问题是,我快疯了,因为注解@requestBody似乎工作错误。
这是我的服务:
@ResponseBody
@RequestMapping(value = "/keyuser", method = RequestMethod.POST,
consumes = "application/json")
public KeyProfileUserSummary updateEmployee(@RequestBody KeyProfileUserSummary keyUser) {
return null;
}
这是我的对象KeyProfileUserSummary的成员:
private Integer id;
private String login;
private String password;
private String firstname;
private String lastname;
private UserRole userRole;
我不知道发生了什么,但我已经用其他类型的对象测试了这个服务,它工作得很好,但当定义KeyProfileUserSummary时,它不工作,我得到错误400 BAD REQUEST。我已经测试了将@RequestBody设置为“Object”,这样至少我可以看到将要发生的事情,从我的前端,我得到了以下信息:
{id=3, login=aa, password=a, firstname=Martin, lastname=Müller, userRole=ROLE_USER}
UserRole是一个枚举。需要说明的是,KeyProfileUserSummary只是KeyProfileUser的一个摘要版本,但由于响应中包含了所有链接元素,因此我决定发送这个轻量级的类。使用KeyProfileUser进行的测试非常成功,我在Angular端获得了JSON对象,并可以将其发送回来。
在Angular 方面,我没有对对象做任何事情,只是在列表中接收它,当按下编辑按钮时,只是将列表中的元素发送回来,这是我发送它的方式:
res = $http.post("url.../keyuser", user);
问题是,我有一切完美的工作与KeyProfileUser,但由于数据库可以得到真正的巨大和参考是相当多的,我决定切换到这个较轻的类,但现在我只得到这个错误400坏请求...我即将挂自己:P
谢谢你的帮忙!
5条答案
按热度按时间fnvucqvd1#
好吧,我终于找到了解决办法。
在我的KeyProfileUserSummary中,我只有一个构造函数,它接受KeyProfileUser并将属性设置为摘要版本:
显然,在dispatchler servlet的第993行设置断点(感谢@Clemens Eberwein的提示),我意识到当解析JSON对象时,Jackson解析器需要一个空构造函数!因此添加它解决了这个问题,并且工作得很好。
注意:对于KeyProfileUser,它工作得很好,因为我们有针对hib的@Entity注解,因此空构造函数是自动创建的。
sqserrrh2#
试试这个..可能对你有用..
np8igboo3#
如果要我猜的话,Jackson在反序列化/序列化你的对象时失败了。
尝试创建一个测试来序列化和反序列化对象jec。创建一个KeyProfileUserSummary对象,然后尝试反序列化/序列化,看看Jackson是否会抱怨。
更简单的方法是启用DEBUG日志记录并检查日志文件,默认情况下您不会看到此类错误
希望有帮助。
wixjitnu4#
如果您为“org.springframework.web”添加调试日志,org.springframework.web. servlet.DispatcherServlet应该为您提供导致“400错误请求”错误的详细信息。
有关Wildfly日志记录配置的详细信息,请参阅here
根据KeyProfileUserSummary类,我猜问题出在UserRole对象上,它在上面的示例中只是
userRole=ROLE_USER
。因为它是一个对象,所以应该用大括号括起来,并且必须设置属性名。例如,类似于如果是枚举,this答案可能会有所帮助
mw3dktmi5#
我也遇到过类似的问题,因为我们的项目设置为在snake的情况下读取json,而不是在camel的情况下