Переменная пути типа оболочки не принимает нулевое значение – Spring Boot

Это наш контроллер

@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, но ошибка все та же.

То, что должно быть сделано?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
0
1 328
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите, чтобы он был нулевым, вы можете добиться этого следующим образом. Прежде всего, если оно допускает значение 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) {

}

Второй подход работает, а первый нет. Спасибо

Arun Sudhakaran 23.12.2020 11:45

@ArunSudhakaran подробнее? Что не работает? В чем ошибка? Просто скопировал и вставил код отсюда, и он отлично работает. Какой звонок вы делаете? Если работает второй, то работает и первый, разница только в типе переменной и требуемой.

burm87 23.12.2020 11:52

Первый подход выдает ту же ошибку, которую я получал ранее.

Arun Sudhakaran 23.12.2020 13:08

@ArunSudhakaran еще раз, можем ли мы получить более подробную информацию? Вы действительно передаете значение «null» в URL-адресе?

burm87 23.12.2020 13:14

Нет, я не проходил его

Arun Sudhakaran 23.12.2020 13:26

Другие вопросы по теме