假设我有一个页面,列出了一个表上的对象,我需要放一个表单来过滤表。过滤器作为Ajax GET发送到如下URL: http://foo.com/system/controller/action?page=1&prop1=x&prop2=y&prop3=z
而不是在我的控制器上有很多参数,比如:
@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
@RequestParam(value = "page", required = false) int page,
@RequestParam(value = "prop1", required = false) String prop1,
@RequestParam(value = "prop2", required = false) String prop2,
@RequestParam(value = "prop3", required = false) String prop3) { ... }
假设我有MyObject为:
public class MyObject {
private String prop1;
private String prop2;
private String prop3;
//Getters and setters
...
}
我想做的是:
@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
@RequestParam(value = "page", required = false) int page,
@RequestParam(value = "myObject", required = false) MyObject myObject,) { ... }
这可能吗?
我该怎么做呢?
我也有类似的问题。事实上,问题比我想的要深刻。我使用jquery $。post使用Content-Type:application/x-www-form-urlencoded;charset=UTF-8默认值。不幸的是,我基于我的系统,当我需要一个复杂的对象作为@RequestParam时,我不能让它发生。
在我的情况下,我试图发送用户首选项的东西;
$.post("/updatePreferences",
{id: 'pr', preferences: p},
function (response) {
...
在客户端,发送到服务器的实际原始数据是;
...
id=pr&preferences%5BuserId%5D=1005012365&preferences%5Baudio%5D=false&preferences%5Btooltip%5D=true&preferences%5Blanguage%5D=en
...
解析的;
id:pr
preferences[userId]:1005012365
preferences[audio]:false
preferences[tooltip]:true
preferences[language]:en
服务器端是;
@RequestMapping(value = "/updatePreferences")
public
@ResponseBody
Object updatePreferences(@RequestParam("id") String id, @RequestParam("preferences") UserPreferences preferences) {
...
return someService.call(preferences);
...
}
我尝试了@ModelAttribute,添加setter/getter,构造函数与所有可能性UserPreferences,但没有机会,因为它识别发送的数据为5个参数,但实际上映射的方法只有2个参数。我也尝试了Biju的解决方案,但发生的情况是,spring创建了一个UserPreferences对象的默认构造函数,不填充数据。
我通过从客户端发送首选项的JSon字符串解决了这个问题,并处理它,就好像它是服务器端的字符串一样;
客户:
$.post("/updatePreferences",
{id: 'pr', preferences: JSON.stringify(p)},
function (response) {
...
服务器:
@RequestMapping(value = "/updatePreferences")
public
@ResponseBody
Object updatePreferences(@RequestParam("id") String id, @RequestParam("preferences") String preferencesJSon) {
String ret = null;
ObjectMapper mapper = new ObjectMapper();
try {
UserPreferences userPreferences = mapper.readValue(preferencesJSon, UserPreferences.class);
return someService.call(userPreferences);
} catch (IOException e) {
e.printStackTrace();
}
}
简单地说,我在REST方法中手动完成了转换。在我看来,spring不能识别发送数据的原因是内容类型。