Spring 3 MVC - 将带有前缀的请求参数映射到单个 bean

发布于 2024-12-11 11:59:05 字数 625 浏览 0 评论 0原文

我有以下 GET 请求:

/api/search?filter.operation=Ping&filter.namespace=

请注意参数名称包含前缀(filter. 操作、<强>过滤器。命名空间)。

然后,我想使用以下 bean 来接收这些参数:

class MessageSearchFilter {
    String operation;
    String namespace;
    ...
}

并且处理程序方法具有以下签名:

public @ResponseBody String searchMessages(MessageSearchFilter filter, ...);

但这并不'不能工作,因为 Spring MVC 期望“操作”和“命名空间”属性的命名与此完全相同。如果我将请求更改为使用“操作”和“命名空间”(没有“过滤器”前缀),它就会起作用。

有什么方法可以告诉 Spring 期望参数以“filter”为前缀吗?

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

I have the following GET request:

/api/search?filter.operation=Ping&filter.namespace=

Please note the parameter names include a prefix (filter. operation, filter. namespace).

Then, I have the following bean I want to use to receive those parameters:

class MessageSearchFilter {
    String operation;
    String namespace;
    ...
}

And the handler method has the following signature:

public @ResponseBody String searchMessages(MessageSearchFilter filter, ...);

However this doesn't work as Spring MVC expects 'operation' and 'namespace' attributes to named exactly like that. It works if I change my request to use 'operation' and 'namespace' (with no 'filter.' prefix).

Is there any way I can tell Spring to expect parameters to be prefixed with 'filter'?

A side question related to this is, what happens if I have a method signature with several form objects with colliding property names?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

忘年祭陌 2024-12-18 11:59:05

您应该能够使用 @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...
}

您还会注意到,您现在应该能够为具有属性名称冲突的其他对象添加限定符。

You should be able to map incoming querystring parameters using @RequestParam, and you can fully qualify them:

//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...
}

You will also notice that you should be able to now add qualifiers for other objects with property name collisions.

秋意浓 2024-12-18 11:59:05

将方法添加到控制器中

@Override
protected String getFieldBindingPrefix() {
    return "filter.";
}

应该可以完成这项工作。

Adding to your controller the method

@Override
protected String getFieldBindingPrefix() {
    return "filter.";
}

should do the job.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文