在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必须具有city
和place
属性才能工作。
有关更多信息,您可以查看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。
我没有尝试过@RequestParam
和Model
这种特定组合,但看起来您可以通过创建自定义WebBindingInitializer
来实现所需的实现,详见http://static.springsource.org/spring/docs/3.2.3 .RELEASE / spring-framework-reference / html / mvc.html#mvc-ann-typeconversion 。
自定义类将具有对WebRequest的访问权限,并将返回填充了从此请求中提取的数据的域对象。