Я пытаюсь создать в своем бэкэнде функцию для создания пользователя, использую для 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
Но я не знаю, как решить эту проблему
Это информация о сервере, которую я получил: «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 не должен быть нулевым!] с основной причиной "
Какой у вас менеджер БД? Oracle или MySQL
Мой менеджер БД - PostgreSQL
Есть ли у вас значения для страны и города с идентификаторами 1 и 4 соответственно, и дает ли отладка оба значения, установленные в пользовательском объекте? Поскольку вы отметили обе связи сущностей как ненулевые, мне просто интересно.




Просто не используйте Long. В качестве идентификатора используйте примитивный тип long.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
Это инициирует поле id с 0, если он недоступен, что решит проблему.
В общем, старайтесь избегать сложных типов данных, если вы также можете использовать простой тип данных. Каждый раз, когда вы используете сложный тип данных вместо простого, должна быть веская причина. В остальном это в основном неприятный запах.
Я изменил его, но это та же ошибка ... Код: "@Id @GeneratedValue (strategy = GenerationType.IDENTITY) private long id;"
Даже если это решит проблему, что вы думаете о таблице со всеми первичными ключами id = 0?
@ MạnhQuyếtNguyễn Он сгенерирует новый ключ, так как это стандартное поведение при аннотировании с помощью @GeneratedValue. Это способ решения этой проблемы по умолчанию.
@Manu, вы уверены, что перекомпилировали свой проект без ошибок? long не может быть нулевым.
Конечно! но у меня такая же ошибка, я думаю, проблема в том, как отправить cityId и countryId в URL ... Это правильно ?: ("/ users / {countryId} / {cityId}") -> localhost: 8080 / users / 1/4
Да, но на данный момент столбец id неправильно сгенерирован на сервере db, поэтому он все равно будет поднимать null
Вы должны установить тип данных столбца id в PostgreSQL на SERIAL.
Смена @PathParam на @PathVariable должна работать.
Вы используете неправильные аннотации.
Редактировать
Spring использует аннотацию для выполнения некоторой специальной логики для извлечения значений из URI запроса или из тела запроса и сопоставления их с соответствующим аннотированным параметром.
Вы используете неправильную аннотацию для параметра, поэтому его значение не указывается.
Когда ваш репозиторий выполняет код для поиска против null, выдает исключение
Та же ошибка ... Я думаю, проблема в URL ... но я не знаю, как решить
Не могли бы вы дать веб-сайт или pdf для более подробного изучения этого вопроса? или читаете об этом? :)
Сервер должен указать, в какой строке вызвана проблема. Не зная причины, это может быть
@Valid, поскольку у вас нет идентификатора пользователя, которого вы создаете.