Spring MVC:作为GET @RequestParam的复杂对象

假设我有一个页面列出了一个表上的对象,我需要把一个窗体过滤表。 该filter以Ajax GETforms发送到如下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,) { ... } 

可能吗? 我怎样才能做到这一点?

你完全可以做到这一点,只需删除@RequestParam注释,Spring将干净地将你的请求参数绑定到你的类实例:

 public @ResponseBody List<MyObject> myAction( @RequestParam(value = "page", required = false) int page, MyObject myObject) 

我会添加一些简短的例子。

DTO课堂:

 public class SearchDTO { private Long id[]; public Long[] getId() { return id; } public void setId(Long[] id) { this.id = id; } // reflection toString from apache commons @Override public String toString() { return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE); } } 

控制器类中的请求映射:

 @RequestMapping(value="/handle", method=RequestMethod.GET) @ResponseBody public String handleRequest(SearchDTO search) { LOG.info("criteria: {}", search); return "OK"; } 

查询:

 http://localhost:8080/app/handle?id=353,234 

结果:

 [http-apr-8080-exec-7] INFO cggrfwExampleController.handleRequest:59 - criteria: SearchDTO[id={353,234}] 

我希望它有助于:)

我有一个非常类似的问题。 其实问题就像我想的那样更深。 我正在使用jquery $.post它使用Content-Type:application/x-www-form-urlencoded; charset=UTF-8 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 ... 

parsing为;

 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 / getters,构造函数以及UserPreferences所有可能性,但没有机会,因为它将发送的数据识别为5个参数,但实际上映射的方法只有2个参数。 我也尝试了Biju的解决scheme,但是会发生什么事情呢,spring会使用默认构造函数创build一个UserPreferences对象,并且不会填充数据。

我通过从客户端发送JSonstring来解决问题,并将其作为服务器端的string来处理;

客户:

  $.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不认识发送数据的原因是内容types。