Spring MVC控制器自定义参数名称

时间:2013-04-11 15:04:26

标签: spring-mvc controller

我有一个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类,并像方法参数一样使用它。 但是如何将自定义名称设置为我的类字段?

e.g:

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

3 个答案:

答案 0 :(得分: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的单个案例PARAMS。如果你坚持,请添加评论。

答案 1 :(得分:0)

这听起来是使用hashmap的好时机,其中key作为var名称,值作为value。将其包裹在表单后备对象中。

答案 2 :(得分:0)

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

@ResponseBody
@RequestMapping(value = "/test", method = RequestMethod.POST)
@Secured({"ROLE_ADMIN"})
    public ResponseEntity<ModelMap> createTest(@Valid @RequestBody FooBarResource body, UriComponentsBuilder builder) {