【问题标题】:Spring 3 MVC - Map request parameters with prefix to a single beanSpring 3 MVC - 将带有前缀的请求参数映射到单个 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' 为前缀?

与此相关的一个附带问题是,如果我的方法签名包含多个具有冲突属性名称的表单对象,会发生什么?

【问题讨论】:

    标签: spring spring-mvc spring-3


    【解决方案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()”方法可以覆盖。 :-(
    • 这也不适用于“具有冲突属性名称的几个表单对象”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    相关资源
    最近更新 更多