将@ResponseBody的一部分作为骨干和Spring MVC控制器之间的参数

时间:2015-04-10 11:11:23

标签: java javascript spring-mvc backbone.js

编辑:经过重新设计后,我不再遇到这个问题了。我应该关闭这个问题吗?

我的门户网站使用骨干网在浏览器中构建GUI,并在服务器上使用Java Spring MVC来提供和接收数据。

在一个实例中,我们在浏览器中显示可以编辑的人员列表。该列表是从服务器发送的,如JSON:

[{id: 1, title: 'Städare', details: {name: 'Stefan', phone: '123456'}},
{id: 2, title: 'Sotare', details: {name: 'Arne', phone: '234567'}}]

"详情"每个用户的部分包含可以编辑的数据," id"骨干需要," title"是一个本地化字段,仅用于演示。

我的问题是,当用户保存此数据中的更改时,我想制作一个这样的控制器方法:

@RequestMappin(value = "/userlist/user/{id}", method = PUT)
public void saveUser(@Valid @RequestBody UserDetails details, @PathVariable("id") String id) {
    (...)
}

在这里,我希望细节对应于"详细信息"上面列出的JSON模型中的部分。但是这不起作用,因为当我从上面的列表中取得模型的骨干中的model.save()时,它将发送包含" title"和"详细信息",它没有映射到看起来像这样的UserDetails类:

public class UserDetails {
    private String name;
    private String phone;
(...)
}

我的问题是:有没有办法让我的Spring MVC控制器方法接收"详细信息"参数中请求体的一部分(我希望它作为参数,因为我在输入方法之前使用@Valid表示法对数据运行验证),或者骨干只将模型的详细信息部分发送到服务器。虽然没有做一些感觉像黑客的事情。

显而易见的替代方法是编写一个包装类,模仿"细节"周围的子结构,并在PUT控制器中使用它。我不想这样做,部分是因为它是一堆不必要的代码,部分是因为我们在为嵌套类运行验证器时遇到了问题。

1 个答案:

答案 0 :(得分:0)

在主干方面,它应该是直接的,并且很容易发送json的用户详细信息部分。文档还说,您也可以发送要在服务器上更改的模型部分。

文档:http://backbonejs.org/#Model-save

因此,您可以发送用户详细信息进行保存,如下所示:

model.save(
    {name: 'Stefan', phone: '123456'},
    {
     success:function(model, response, options){},
     error:function(model, response, options){}
    }
);

在这种情况下,保存调用会将idAttribute附加到url并发送属性哈希,在您的情况下是用户详细信息。