Spring Boot REST Hibernate - Создать пользователя - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь создать функцию в своем бэкэнде для создания пользователя, я использую 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) и полезной нагрузкой:

URL

localhost:8080/users/1/4

Payload

{
    "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 ОШИБКА 17964 --- [io-8080-exec-10] o.a.c.c.C. [. [. [/]. [dispatcherServlet]: Servlet.service () для сервлет [dispatcherServlet] в контексте с путем [] вызвал исключение [Ошибка обработки запроса; вложенное исключение org.springframework.dao.InvalidDataAccessApiUsageException: данный id не должен быть нулевым !; вложенное исключение java.lang.IllegalArgumentException: указанный идентификатор не должен быть нулевым!] с первопричиной

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

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

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

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

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

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

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

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

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

0 голосов
/ 07 мая 2018

Просто не используйте Long. Используйте тип примитива long для вашего идентификатора.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...