在Spring中将路径变量绑定到自定义模型对象

我有一个模拟我的请求的类,比如

class Venue { private String city; private string place; // Respective getters and setters. } 

我想支持一个RESTful URL来获取有关场地的信息。 所以我有这样的控制器方法。

 @RequestMapping(value = "/venue/{city}/{place}", method = "GET") public String getVenueDetails(@PathVariable("city") String city, @PathVariable("place") String place, Model model) { // code } 

有没有办法,我可以说在spring将我的路径变量绑定到模型对象(在本例中为Venue)而不是获取每个单独的参数?

Spring MVC提供了将请求参数和路径变量绑定到JavaBean的function,在您的情况下,它是Venue 。 例如:

 @RequestMapping(value = "/venue/{city}/{place}", method = "GET") public String getVenueDetails(Venue venue, Model model) { // venue object will be automatically populated with city and place } 

请注意,您的JavaBean必须具有cityplace属性才能工作。

有关更多信息,您可以查看spring-projects / spring-mvc-showcase中的withParamGroup()示例

您可以提供HandlerMethodArgumentResolver接口的实现。 这个接口主要用于以Spring无法解决的方式解析控制器方法的参数(这实际上就是你要做的)。 您可以通过实现以下两种方法来实现:

 public boolean supportsParameter(MethodParameter mp) { ... } public Object resolveArgument(mp, mavc, nwr, wdbf) throws Exception { ... } 

您可以通过以下方式将实现注入Spring上下文:

      

当Spring遇到无法解析的参数时,它会调用你的方法supportsParameter()来查看你的解析器是否可以解析参数。 如果您的方法返回true,那么Spring将调用您的resolveArgument()方法来实际解析参数。 在此方法中,您可以访问NativeWebRequest对象,您可以使用该对象来获取contextPath之外的路径。 (在您的情况下,它将是: /venue/{city}/{place} )您可以解析请求路径并尝试在您的Venue对象中填充城市/地点字符串。

根据http://static.springsource.org/spring/docs/3.2.3.RELEASE/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates上提供的Spring文档,自动仅为简单类型提供支持:

@PathVariable参数可以是任何简单类型,例如int,long,Date等。如果未能执行此操作,Spring会自动转换为适当的类型或抛出TypeMismatchException。

我没有尝试过@RequestParamModel这种特定组合,但看起来您可以通过创建自定义WebBindingInitializer来实现所需的实现,详见http://static.springsource.org/spring/docs/3.2.3 .RELEASE / spring-framework-reference / html / mvc.html#mvc-ann-typeconversion 。

自定义类将具有对WebRequest的访问权限,并将返回填充了从此请求中提取的数据的域对象。