Spring 3 MVC - 将带有前缀的请求参数映射到单个 bean
Posted
技术标签:
【中文标题】Spring 3 MVC - 将带有前缀的请求参数映射到单个 bean【英文标题】:Spring 3 MVC - Map request parameters with prefix to a single bean 【发布时间】:2011-12-14 05:22:48 【问题描述】:我有以下 GET 请求:
/api/search?filter.operation=Ping&filter.namespace=
请注意参数名称包含前缀(filter. 操作,filter. 命名空间)。
然后,我想使用以下 bean 来接收这些参数:
class MessageSearchFilter
String operation;
String namespace;
...
并且处理程序方法具有以下签名:
public @ResponseBody String searchMessages(MessageSearchFilter filter, ...);
但是,这不起作用,因为 Spring MVC 期望“操作”和“命名空间”属性完全像这样命名。如果我将请求更改为使用“操作”和“命名空间”(没有“过滤器。”前缀),它会起作用。
有什么方法可以告诉 Spring 期望参数以 'filter' 为前缀?
与此相关的一个附带问题是,如果我的方法签名包含多个具有冲突属性名称的表单对象,会发生什么?
【问题讨论】:
【参考方案1】:您应该能够使用@RequestParam
映射传入的查询字符串参数,并且您可以完全限定它们:
//Your @RequestMapping here...
public @ResponseBody String searchMessages(
@Requestparam("filter.operation") String filterOperation,
@RequestParam("filter.namespace") String filterNamespace)
MessageSearchFilter messageSearchFilter = new MessageSearchFilter();
messageSearchFilter.operation = filterOperation;
messageSearchFilter.namespace = filterNamespace;
//do your thing here...
您还会注意到,您现在应该能够为具有属性名称冲突的其他对象添加限定符。
【讨论】:
谢谢,不过,我一直在寻找一种方法来避免自己手动创建和设置 bean 值。我希望这能以某种方式工作,因为 Spring 为嵌套 bean 正确地做到了这一点。 我也很感兴趣,是否有一种 Spring 方法可以将这些属性直接注入到 bean 中?【参考方案2】:将方法添加到您的控制器
@Override
protected String getFieldBindingPrefix()
return "filter.";
应该做的工作。
【讨论】:
你能解释一下答案吗?我在谷歌上没有发现任何关于这种方法的信息。在我的控制器类中没有任何“getFieldBindingPrefix()”方法可以覆盖。 :-( 这也不适用于“具有冲突属性名称的几个表单对象”以上是关于Spring 3 MVC - 将带有前缀的请求参数映射到单个 bean的主要内容,如果未能解决你的问题,请参考以下文章