Spring 3 Сопоставление параметров запроса MVC. Два параметра из одного класса при вызове обработчика в контроллере

Я пытаюсь понять, как передать два разных параметра одного и того же класса через URL-адрес методу обработчика в контроллере. Например, для класса «Foo» с параметром «id» (я говорю только об одном параметре, чтобы упростить его, но подумайте о классе с их множеством), код контроллера выглядит следующим образом:

@Controller(value = "customerCareRemoteService")
public class CustomerCareRemoteServiceImpl {

// Othe methods/requests

    @RequestMapping(value = "/" + "prueba" , method = RequestMethod.GET)
    public @ResponseBody String prueba(Foo pFoo1, Foo pFoo2) {
        //stupid and not interesting code
        String answer = "pFoo1.id is " + pFoo1.id + ". pFoo2.id is " + pFoo2.id.";
        System.out.println(answer);
        return answer;

    }

}

Итак, когда я вызываю этот метод, нет никакой разницы между двумя параметрами:

http://myfakeurl/prueba?id=1&id=2

Как мне быть с этим? Есть ли способ «префиксировать» параметры? Я видел @RequestParam, но он не работает для меня, потому что его нельзя использовать с моими собственными и личными классами красоты (или я ошибаюсь?). Также я хотел бы избежать классов-оболочек. Спасибо за уделенное время.


person raspayu    schedule 10.05.2012    source источник


Ответы (2)


Вы должны использовать @PathVariable для решения этой проблемы.

Ваш URL-адрес сопоставления будет таким.

@RequestMapping(value = "/" + "prueba" + "/{id1}/{id2}" , method = RequestMethod.GET) 

и аргументы в вашей функции были бы.

public @ResponseBody String prueba(@PathVariable int pFoo1, @PathVariable int pFoo2)

Таким образом, вы можете получить оба идентификатора в своем контроллере для дальнейшей работы с ними.

Надеюсь, это помогло вам.

Ваше здоровье.

person Japan Trivedi    schedule 11.05.2012
comment
Привет, спасибо за ответ, но дело в том, что я хотел, чтобы параметр URL заполнил атрибут объекта. Я имею в виду, что я сказал, что объект Foo имеет один атрибут, но это только для простоты примера. На самом деле я пытаюсь заполнить различные атрибуты. Но спасибо :-) - person raspayu; 11.05.2012
comment
В этом случае вы должны использовать @RequestAttribute, который свяжет все ваши атрибуты из вашего представления с объектом модели. - person Japan Trivedi; 11.05.2012
comment
Ну... я думаю, что это работает для примитивных типов, но не для атрибутов из классов (я имею в виду, не для Foo.id, например). - person raspayu; 11.05.2012
comment
О, извините, я имел в виду использование @ModelAttribute. Извини за ошибку. Пожалуйста, проверьте это. @ModelAttribute должен сделать всю работу за вас. :) - person Japan Trivedi; 12.05.2012
comment
Мне очень жаль быть скучным, но я уже читал это пару раз, когда искал в Интернете, но так и не нашел объяснения/примера. В документации от Spring говорится, что это способ связать контроллер с моделью... Но я не понимаю, как преобразовать параметры в URL-адрес в объект :-( - person raspayu; 14.05.2012
comment
Зачем вам нужно их конвертировать? Они будут автоматически привязаны к вашему объекту @ModelAttribute. Мне интересно, почему вам нужно преобразовать их. - person Japan Trivedi; 14.05.2012
comment
Ну... Дело в том, что мне нужно иметь возможность передавать 2 атрибута с одинаковым именем одного и того же/разных классов в качестве параметра в URL-адресе. Например: fakeurl/prueba?id=1&id=2 . В этом случае допустим, что первый идентификатор является атрибутом класса Param1, а второй идентификатор — атрибутом класса Param2. Это то, что я хочу сделать, переименовать хотя бы один из них во что-то, чтобы они не смешивались (по умолчанию, если вы говорите id = 2, тогда оба параметра получат значение 2. - person raspayu; 14.05.2012

Итак, с некоторой помощью товарища по работе, я пришел к следующей странице, которая говорит об этой теме:

Настройка имен параметров при привязке объектов команд Spring MVC

Что приводит к следующему вопросу StackOverFlow:

Как настроить имена параметров, когда привязка объектов команды spring mvc

Таким образом, похоже, что нет простого решения, такого как «использование аннотации X», но для создания собственного преобразователя и использования пользовательских аннотаций (как хороший новичок, я все еще пытаюсь понять это :-S).

person raspayu    schedule 14.05.2012