0

我有一个 Spring MVC 控制器。我在方法中有 50 个参数。所有参数都有非常具体的名称,例如:FOO[]。我不想像这样在方法签名中写 50 个参数:

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public String test(
    @RequestParam(value = "FOO[]") String foo,
    @RequestParam(value = "BAR[]") String bar,
// Other 48 parameters
)
{
    return "test";
}

我想将所有参数映射到一个对象上,我的意思是,我想用 getter/setter 编写一个简单的 bean 类,并像方法参数一样使用它。但是如何为我的类字段设置自定义名称?

例如:

class FooBar {
    @SomeAnnotation_for_binding_the_field_to_my_field_FOO[]
    private String foo;
    private String bar;
    // Other 48 fields
    // getters/setters
}
4

3 回答 3

1

我知道注释有点酷,但要理性思考。您必须在代码中枚举所有映射。将 FOO[] 映射到 foo 没有任何隐含意义,它似乎超出了您的控制范围。只需将参数作为映射(您始终可以要求 Spring 为您提供所有参数的映射)并执行以下操作:

@RequestMapping
public String test(@RequestParam Map<String, Object> map) {
    MyObject mo = new MyObject();
    mo.setFoo(map.get("FOO[]").toString());
    mo.setBar(map.get("WOBBLE13[][]").toString);
    return "whatever";
}

如果您想让这个过程更加自动化,并且如果存在将参数名称映射到属性名称的算法,您可以使用 Spring 的 bean 包装器:

@RequestMapping
public String test(@RequestParam Map<String, String> map) {
   BeanWrapper bw = new BeanWrapperImpl(new MyObject);
   for (Entry<String, Object> entry : map.entrySet()) {
       bw.setProperty(entry.getKey(), entry.getValue());
   }
}

private static String decodeName(String n) {
    return n.toLowerCase().substring(0,n.length() - 2);
}

您可以通过使用不同的 Binder 使该过程更加自动化,您可以(真的,这不是问题)添加一些自定义注释......但实际上,如果您只有一个 50 个参数的案例,那么没有意义。如果您坚持,请添加评论。

于 2013-04-11T23:18:15.057 回答
0

这听起来像是使用哈希映射的好时机,其中键作为 var 名称,值作为值。将其包装在表单支持对象中。

于 2013-04-11T15:13:33.317 回答
0

您可以拥有一个资源类,即 FooBarResource.jave 并在您的控制器中将其用作请求主体,如下所示:

@ResponseBody
@RequestMapping(value = "/test", method = RequestMethod.POST)
@Secured({"ROLE_ADMIN"})
    public ResponseEntity<ModelMap> createTest(@Valid @RequestBody FooBarResource body, UriComponentsBuilder builder) {
于 2013-04-11T15:22:59.983 回答