2016-01-05 2 views
0

У меня есть метод контроллера, как такДополнительный <Integer> нет, пока она отправляется

@RequestMapping(value = "/update", method = RequestMethod.POST) 
    RestResponse updateId(@RequestParam(value = "cityId") Optional<Integer> cityId) { 
    } 

Теперь, когда я посылаю cityId без значения, cityId.isPresent() возвращает ложь, что это неправильно, потому что я на самом деле включены cityId в моих параметрах запроса но я просто не установил значение.

Я заметил, что это поведение не происходит на Optional<String>, оно фактически говорит мне, что параметр присутствует, даже если он не имеет значения.

Итак, как мне обрабатывать параметры, подобные Optional<Integer>? Мне просто нужно, чтобы определить, что параметр был отправлен, даже если он не имел никакого значения (потому что это необязательно, и если оно было отправлено без значения я должен обновить базу данных)

редактировать: Похоже, что я написал выше сбивает с толку, я постараюсь описать проблему снова

@RequestMapping(value = "/temp", method = RequestMethod.POST) 
void temporary(@RequestParam(value = "homeCityId") Optional<Integer> homeCityId) { 
    if(homeCityId.isPresent()) { 
     System.out.println("homeCityId is Present"); 
    } else { 
     System.out.println("homeCityId is Not Present"); 
    } 
} 

Я делаю запрос, который включает в себя homeCityId с пустым значением, я получаю homeCityId is Not Present. Как я могу различать запрос с homeCityId с пустым значением и запрос, который не включал homeCityId?

+0

Я не понимаю, даже если он не имеет значения_. Если он присутствует, что возвращает 'cityId.get()'? –

+0

Лично я бы не использовал 'Факультативный' для этого сценарий. В любом случае вы все равно проверяете «null». – Makoto

+0

@SotiriosDelimanolis cityId.get() выдает исключение «NoSuchElementException», но cityId был отправлен с помощью запроса, он просто не имеет значения. бит низкого уровня, и я проверил 'ServletReques t' в моем Token Filter и действительно cityId есть, но по какой-то причине он не передается контроллеру. скриншот http://i.imgur.com/CP9cytQ.png – prettyvoid

ответ

1

Как отличить запрос, которые имеют homeCityId с пустым значением и просьбой не включать homeCityId вообще?

Вам необходимо обработать случай homeCityId присутствующих, независимо от пустого или нет, в виде одного случая. Тогда вам понадобится другой обработчик для отсутствия.

Во-первых, вы можете использовать @RequestMapping#params, чтобы установить homeCityId как необходимое сопоставление параметров для вызываемого обработчика.

@RequestMapping(value = "/temp", params = { "homeCityId" }, method = RequestMethod.POST) 
public String present(@RequestParam(value = "homeCityId") Integer homeCityId) { 

Затем проверьте, если homeCityId является null или нет.

Во-вторых, у вас есть второй обработчик, который не требует параметра homeCityId.

@RequestMapping(value = "/temp", method = RequestMethod.POST) 
public String notPresent() { 

Spring MVC всегда будет вызывать первый, если параметр присутствует (и вы будете иметь доступ к его значению. Это будет вызывать второй, если параметр отсутствует. Так как он отсутствует, нет никакой ценности для вас беспокоиться.

+0

Спасибо за ответ, что, если у меня есть метод контроллера, который принимает большое количество параметров, например, 15 необязательных целых чисел, похоже, для этого потребуется много разных методов, чтобы учитывать все случаи, верно? – prettyvoid