В контроллере Spring можно ли вызывать метод, основанный на количестве параметров запроса? - PullRequest
11 голосов
/ 21 апреля 2011

Я модернизировал существующее веб-приложение с помощью Spring.Очевидно, что проще начать с Spring, чем добавить его позже.

У нас есть сервлеты, которые могут принимать несколько параметров запроса.В зависимости от количества параметров будут предприняты различные действия.Например,

/doSomething?prod=15

отображает информацию для продукта 15, а

/doSomething?prod=15&owner=99

устанавливает владельца продукта 15 на 99, а

/doSomething?prod=15&delete=y

удаляет продукт 15.

У меня работает контроллер, но я не знаю, как вызывать разные методы в зависимости от количества параметров.Например, это работает (простой метод, чтобы убедиться, что у меня работают основы):

@RequestMapping(method=RequestMethod.GET)
public ModelAndView doIt(@RequestParam("prod") int prod, Model model)
{
  ModelAndView mav = new ModelAndView();
  mav.setViewName("jsonView");
  return mav;
}

, но не это:

@RequestMapping(method=RequestMethod.GET)
public ModelAndView doIt(@RequestParam("prod") int prod, Model model)
{
  ModelAndView mav = new ModelAndView();
  mav.setViewName("jsonView");
  return mav;
}

@RequestMapping(method=RequestMethod.GET)
public ModelAndView doIt(@RequestParam("prod") int prod,
                         @RequestParam("owner") int owner,
                         Model model)
{
  ModelAndView mav = new ModelAndView();
  mav.setViewName("jsonView");
  return mav;
}

Это вызывает исключение IllegalStateException, "Методы обработчика неоднозначности сопоставленыдля HTTP-пути "/ mytest" "и переходит в состояние:

Если вы собираетесь обрабатывать один и тот же путь в нескольких методах, то выделите их в выделенный класс обработчика с этим путем, отображенным втип уровня!

Я не понимаю, что это сообщение говорит мне делать.

Если я настрою метод для приема большего количества или других параметров, чем передается в, я получаю«Запрос, отправленный клиентом, был синтаксически неверным ()».

Пол

Ответы [ 2 ]

21 голосов
/ 22 апреля 2011

Аннотация RequestMapping сообщает Spring, какие URL-адреса запрашиваются для сопоставления с вашим контроллером. Вы можете поместить значение либо на уровне метода, либо на уровне класса.

В вашем примере ничто не отличается между двумя сопоставлениями запросов. Вы можете сделать это, хотя:

@RequestMapping(value="/bar/example.htm", method={RequestMethod.GET}, params={"prod", "owner"})
public String doIt( @RequestParam("prod") int prod,
                    @RequestParam("owner") int owner) {
    LOGGER.trace("in doIt(int,int)");
    return "foo/bar";
}
@RequestMapping(value="/bar/example.htm", method={RequestMethod.GET}, params={"prod"})
public String doIt( @RequestParam("prod") int prod) {
    LOGGER.trace("in doIt(int)");
    return "foo/bar";
}

Вы даже можете поделиться моделью между ними, если хотите:

@Model
public static Map<String,Object> model() {
  LOGGER.trace("in model()");
  Map<String,Object> model = new HashMap<>();
  model.put("hello", "hello world");
  return model;
}
4 голосов
/ 21 апреля 2011

Ваше сопоставление запроса должно отображать реальный URL, а не только метод HTTP.Вы также можете поместить необходимые параметры для каждого метода, например так ...

@RequestMapping(value="/doSomething", method=RequestMethod.GET, params=["prod", "owner"])
public ModelAndView doIt(@RequestParam("prod") int prod,
                         @RequestParam("owner") int owner,
                         Model model)
{
  ModelAndView mav = new ModelAndView();
  mav.setViewName("jsonView");
  return mav;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...