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的主要内容,如果未能解决你的问题,请参考以下文章

带有 MVC 的 Spring 3 JSON

spring mvc的几种使用方式1

spring mvc的几种使用方式1

带有 @PathVariable 的 Spring MVC 带注释的控制器接口

Spring MVC:将请求属性绑定到控制器方法参数

Spring MVC day01 请求参数问题及常用注解