2013-04-11 3 views
0

У меня есть контроллер Spring MVC. И у меня есть в методе 50 параметров. Все параметры имеют очень специфическое имя, например: FOO []. Я не хочу писать 50 параметров в сигнатуре метода, как это:Имя специального параметра контроллера Spring MVC

@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"; 
} 

Я хочу, чтобы отобразить все параметры на одном объекте, я имею в виду, я хочу написать простой класс компонента с геттер/сеттер и использовать его как параметр метода. Но как я могу задать собственные имена для полей класса?

.: например

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

ответ

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"; 
} 

Если вы хотите, чтобы сделать этот процесс более автоматизированным, и если существует alorithm что карты имена параметров к именам свойств, вы можете использовать фасоль обертку весны:

@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); 
} 

вы могли бы сделать этот процесс еще более автоматизированным с использованием другого связующего вещества, можно (на самом деле, не проблема) добавить некоторые пользовательские аннотации .. но на самом деле нет смысла, если у вас всего один случай из 50 параметров. Если вы настаиваете, добавьте комментарий.

0

Это звучит как хорошее время, чтобы использовать HashMap, с ключом в качестве имени вара и значения в качестве значения. Оберните это в объект, поддерживающий форму.

+0

Не могли бы вы показать мой небольшой пример? – Andrew

0

Вы могли бы иметь класс ресурсов FooBarResource.jave и то есть в вашем использовании контроллера, что как-то запрос тела, как следующее:

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

И как я могу назвать свое поле ** FOO [] ** в Java? :) – Andrew

+0

у вас был класс FooBar, который я только что переименовал :) вы можете использовать тот же класс, что и ваш класс ресурсов. Если вам нужны какие-либо поля в контроллере, вы просто делаете body.getFoo(), например. вы также можете делать такие вещи, как @NotNull (message = "foo является обязательным") на foo в вашем классе ресурсов. – justMe

Смежные вопросы