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

时间:2013-06-17 13:59:34

标签: java spring path-variables

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

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
}

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

3 个答案:

答案 0 :(得分:30)

Spring MVC提供了将请求参数和路径变量绑定到JavaBean的功能,在您的情况下为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属性才能生效。

有关详细信息,请查看withParamGroup() example from spring-projects/spring-mvc-showcase

答案 1 :(得分:3)

根据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,   日期等.Spring自动转换为适当的类型或   如果不能这样做,则抛出TypeMismatchException。

我没有尝试@RequestParamModel的这种特定组合,但看起来您可以通过创建自定义WebBindingInitializer来实现所需的实现,详见{{3 }}。

自定义类可以访问WebRequest,并返回一个填充了从此请求中提取的数据的域对象。

答案 2 :(得分:3)

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

public boolean supportsParameter(MethodParameter mp) {
    ...
}

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

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

<mvc:annotation-driven>
    <mvc:argument-resolvers>
        <bean class="com.path.ImplementationOfHandlerMethodArgumentResolver"/>
    </mvc:argument-resolvers>
</mvc:annotation-driven>

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