Значение параметра [1] не соответствует ожидаемому типу [java.lang.Integer (n/a)]

У меня есть контроллер сущности и отдыха, когда я делаю запрос к своему контроллеру, он выдает это исключение:

java.lang.IllegalArgumentException: Parameter value [1] did not match expected type [java.lang.Integer (n/a)]

Мой контроллер:

@GetMapping("/createCharacter")
public Character createCharacters(@RequestParam("userId") Integer userId, @RequestParam("mapId") long mapId) {
    return createCharactersService.createCharacters(userId, mapId);
}

Моя сущность имеет идентификатор типа int:

  @Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

Чего именно вы пытаетесь достичь?

Christos Karapapas 12.04.2019 18:15

Я попытался изменить Integer на Long или String, это помогло решить мою проблему, но в этом случае мой объект Spring Data Rest для пользователя не работает.

gg ff 12.04.2019 18:18

Зачем вам объявлять идентификатор как строку, это uuid? Обычно идентификаторы имеют тип Long в сущности, особенно когда поле относительного идентификатора в базе данных имеет значение Big Integer.

Christos Karapapas 12.04.2019 18:23

Да, это UUID. Но теперь я заменил его примитивными числами.

gg ff 12.04.2019 18:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
18 766
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Поскольку идентификатор является uuid, вы должны сохранить его как строку в объекте.

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private String id;

Поэтому вы обязаны использовать его как строку в службе и в контроллере.

@GetMapping("/createCharacter")
public Character createCharacters(@RequestParam("userId") String userId, @RequestParam("mapId") long mapId) {
    return createCharactersService.createCharacters(userId, mapId);
}

Для тех, кто находит эту проблему на основе ошибки:

java.lang.IllegalArgumentException: Parameter value [Type@abdc80fc] did not match expected type [Type (n/a)]

Вы можете использовать JPA следующим образом:

@Repository
public interface OtherRepository extends JpaRepository<Other, Long> {
    List<Other> findAllByType(final Type type);

В этом случае используйте идентификатор типа (таким образом: findAllByTypeId).

Если вы используете JPA с @Query, например:

 @Query("SELECT r FROM Employee r WHERE r.empId = ?1)
 Employee getMyEmployee(long id);

ИЛИ

@Query("SELECT r FROM Employee r WHERE r.empId = :id)
Employee getMyEmployee(@Param("id") long id);

Убедитесь, что передаваемый параметр имеет значение длинная, а empId также является значением длинная. Если вы выполните метод classObj.getMyEmployee(someIntVariable) передача значения инт может вызвать указанную выше ошибку.

в моем случае я использовал DTO, поэтому

Ранее мой @query был таким

@query("SELECT ... WHERE ucs.district = ?1")

потом Я изменил @query вот так

@query("SELECT ... WHERE ucs.district.id = ?1")

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