我有一个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
}
答案 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) {