Это наш контроллер
@GetMapping(path = "/getUsersForHierarchy/{entity}/{hierId}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<UserInfo>> getUsersForHierarchy(@PathVariable(name = "entity", required = true) int entity,
@PathVariable(name = "hierId", required = true) Integer hierId) {
..................
..................
}
Мы ожидаем два Path variables
, один типа int
(entity), а другой типа Integer
(hierId). hierId
может быть нулевым или любым числовым значением, поэтому он сохраняется как Wrapper
. Но выдает ошибку при запуске такого запроса
http://localhost:5010/v1/accountholder/userinfo/getUsersForHierarchy/5/null
Теперь Wrapper должен принимать значения null
, но мы получаем такую ошибку
Не удалось преобразовать значение типа «java.lang.String» в требуемый тип «java.lang.Integer»; вложенным исключением является java.lang.NumberFormatException: для входной строки: "null"
Если мы меняем Integer на String вызов попадает внутрь контроллера, но для дальнейших действий нам нужно использовать Integer.
Мы изучили эту переменную Spring MVC @Path с нулевым значением и попытались вызвать API с таким изменением URL-адреса.
http://localhost:5010/v1/accountholder/userinfo/getUsersForHierarchy/5/blaaa/null, но ошибка все та же.
То, что должно быть сделано?
Если вы хотите, чтобы он был нулевым, вы можете добиться этого следующим образом. Прежде всего, если оно допускает значение NULL, требуемое свойство должно быть false
. Кроме того, учитывая, что required = true
используется по умолчанию, нет необходимости указывать его, и если имя переменной пути совпадает с именем соответствующей переменной, вам также не нужно указывать имя.
@GetMapping(value = {
"/getUsersForHierarchy/{entity}/",
"/getUsersForHierarchy/{entity}/{hierId}"
},
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<UserInfo>> getUsersForHierarchy(
@PathVariable int entity,
@PathVariable(required = false) Integer hierId) {
}
Учитывая, что я не люблю преднамеренно разрешать нулевое значение в приложении, еще одним приятным моментом может быть наличие hierId
, требуемого с типом Optional
, поэтому следующее даст вам Optional.empty
, когда просто вызывается /getUsersForHierarchy/123/
, а hierId
имеет значение null. В противном случае он будет заполнять необязательный параметр, когда hierId
предоставляется, вызывая /getUsersForHierarchy/123/321
:
@GetMapping(value = {
"/getUsersForHierarchy/{entity}/",
"/getUsersForHierarchy/{entity}/{hierId}"
},
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<UserInfo>> getUsersForHierarchy(
@PathVariable int entity,
@PathVariable Optional<Integer> hierId) {
}
@ArunSudhakaran подробнее? Что не работает? В чем ошибка? Просто скопировал и вставил код отсюда, и он отлично работает. Какой звонок вы делаете? Если работает второй, то работает и первый, разница только в типе переменной и требуемой.
Первый подход выдает ту же ошибку, которую я получал ранее.
@ArunSudhakaran еще раз, можем ли мы получить более подробную информацию? Вы действительно передаете значение «null» в URL-адресе?
Нет, я не проходил его
Второй подход работает, а первый нет. Спасибо