Spring Boot REST Hibernate - Создать пользователя

Я пытаюсь создать в своем бэкэнде функцию для создания пользователя, использую для Spring Boot, Hibernate, JPA, PostgreSQL ... Это мой код:

User.java

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @NotBlank
    @Size(max = 100)
    @Column(name = "firstName")
    private String name;

    @NotNull
    @NotBlank
    @Size(max = 30)
    @Column(name = "username", unique = true)
    private String username;

    @NotNull
    @NotBlank
    @Size(max = 150)
    @Column(name = "password")
    private String password;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "cityId", nullable = false)
    @JsonIgnore
    private City city;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "countryId", nullable = false)
    @JsonIgnore
    private Country country;

    // Getters and Setters
    ...
}

UserController.java

@PostMapping("/users/{countryId}/{cityId}")
public User createUser(@PathParam(value = "countryId") Long countryId, @PathParam(value = "cityId") Long cityId,
        @Valid @RequestBody User user) {
    user.setCountry(countryRepository.findById(countryId)
            .orElseThrow(() -> new ResourceNotFoundException("Country not found with id " + countryId)));
    user.setCity(cityRepository.findById(cityId)
            .orElseThrow(() -> new ResourceNotFoundException("City not found with id " + cityId)));
    return userRepository.save(user);
}

UserRepository.java

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByCountryId(Long countryId);

    List<User> findByCityId(Long cityId);
}

Я использую Почтальон для тестирования. Я пытаюсь создать пользователя с этим URL (1 = countryID, 4 = cityId) и Payload:

URL

localhost:8080/users/1/4

Полезная нагрузка

{
    "name": "David",
    "username": "david",
    "password": "test",
}

и я получил эту ошибку ...

ОШИБКА:

{
    "timestamp": "2018-05-07T13:44:03.497+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "The given id must not be null!; nested exception is java.lang.IllegalArgumentException: The given id must not be null!",
    "path": "/users/1/4"
}

2018-05-07 14:25:40.484 ERROR 17964 --- [io-8080-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: The given id must not be null!; nested exception is java.lang.IllegalArgumentException: The given id must not be null!] with root cause

Но я не знаю, как решить эту проблему

Сервер должен указать, в какой строке вызвана проблема. Не зная причины, это может быть @Valid, поскольку у вас нет идентификатора пользователя, которого вы создаете.

Compass 07.05.2018 15:56

Это информация о сервере, которую я получил: «2018-05-07 14: 25: 40.484 ОШИБКА 17964 --- [io-8080-exec-10] oaccC [. [. [/]. [DispatcherServlet]: Servlet.service ( ) для сервлета [dispatcherServlet] в контексте с path [] сгенерировано исключение [Ошибка обработки запроса; вложенное исключение - org.springframework.dao.InvalidDataAccessApiUsageException: данный идентификатор не должен быть нулевым !; вложенное исключение - java.lang.IllegalArgumentException: данное id не должен быть нулевым!] с основной причиной "

Manu 07.05.2018 15:58

Какой у вас менеджер БД? Oracle или MySQL

Mạnh Quyết Nguyễn 07.05.2018 15:59

Мой менеджер БД - PostgreSQL

Manu 07.05.2018 16:00

Есть ли у вас значения для страны и города с идентификаторами 1 и 4 соответственно, и дает ли отладка оба значения, установленные в пользовательском объекте? Поскольку вы отметили обе связи сущностей как ненулевые, мне просто интересно.

Karthik R 07.05.2018 16:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
5
2 538
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Просто не используйте Long. В качестве идентификатора используйте примитивный тип long.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

Это инициирует поле id с 0, если он недоступен, что решит проблему.

В общем, старайтесь избегать сложных типов данных, если вы также можете использовать простой тип данных. Каждый раз, когда вы используете сложный тип данных вместо простого, должна быть веская причина. В остальном это в основном неприятный запах.

Я изменил его, но это та же ошибка ... Код: "@Id @GeneratedValue (strategy = GenerationType.IDENTITY) private long id;"

Manu 07.05.2018 16:07

Даже если это решит проблему, что вы думаете о таблице со всеми первичными ключами id = 0?

Mạnh Quyết Nguyễn 07.05.2018 16:09

@ MạnhQuyếtNguyễn Он сгенерирует новый ключ, так как это стандартное поведение при аннотировании с помощью @GeneratedValue. Это способ решения этой проблемы по умолчанию.

Herr Derb 07.05.2018 16:10

@Manu, вы уверены, что перекомпилировали свой проект без ошибок? long не может быть нулевым.

Herr Derb 07.05.2018 16:14

Конечно! но у меня такая же ошибка, я думаю, проблема в том, как отправить cityId и countryId в URL ... Это правильно ?: ("/ users / {countryId} / {cityId}") -> localhost: 8080 / users / 1/4

Manu 07.05.2018 16:19

Да, но на данный момент столбец id неправильно сгенерирован на сервере db, поэтому он все равно будет поднимать null

Mạnh Quyết Nguyễn 07.05.2018 16:20
Ответ принят как подходящий

Вы должны установить тип данных столбца id в PostgreSQL на SERIAL.

Смена @PathParam на @PathVariable должна работать.

Вы используете неправильные аннотации.

Редактировать

Spring использует аннотацию для выполнения некоторой специальной логики для извлечения значений из URI запроса или из тела запроса и сопоставления их с соответствующим аннотированным параметром.

Вы используете неправильную аннотацию для параметра, поэтому его значение не указывается.

Когда ваш репозиторий выполняет код для поиска против null, выдает исключение

Та же ошибка ... Я думаю, проблема в URL ... но я не знаю, как решить

Manu 07.05.2018 16:22

Не могли бы вы дать веб-сайт или pdf для более подробного изучения этого вопроса? или читаете об этом? :)

Manu 07.05.2018 16:35

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

Похожие вопросы