33

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

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),而不是获取每个单独的参数?

4

3 回答 3

43

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属性才能使其工作。

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

于 2014-04-24T04:37:40.757 回答
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、Date 等。Spring 会自动转换为适当的类型,或者如果它失败则抛出 TypeMismatchException。

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

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

于 2013-06-17T17:02:15.753 回答
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}:)您可以解析请求路径并尝试获取城市/地点字符串以填充到您的场地对象中。

于 2013-08-14T03:07:58.740 回答