我有一个模拟我的请求的类,比如
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)而不是获取每个参数?
答案 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必须具有city
和place
属性才能生效。
有关详细信息,请查看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。
我没有尝试@RequestParam
和Model
的这种特定组合,但看起来您可以通过创建自定义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}
)
您可以解析请求路径并尝试获取城市/地点字符串
填充你的场地对象。