Я создал java проект, используя инструмент Spring Initializr. У меня есть два ресурса: users и trainingRoutines.
Я бы хотел контролировать конечные точки, которые я выставляю. Чтобы избежать захвата Spring Data Rest, я задаю @RestResource(exported = false)
в объявлении хранилища.
То, что я пытаюсь сделать sh, - это возможность вызова POST /training-routines
с:
{
"title": "test",
"goal" : "test",
"startDate": "2020-03-17",
"userId": 1
}
С учетом вышеприведенного запроса я ожидаю, что моя конечная точка создаст программу тренировки и свяжет ее с пользователем с идентификатором 1.
С чем я борюсь, так это с работой отношения. Я думал, что это будет работать, устанавливая отношения:
// TrainingRoutine.kt
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
lateinit var user : User
// User.kt
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
lateinit var trainingRoutines : Set<TrainingRoutine>
Мой контроллер / служба выглядит так:
val user : User = this.userService.findById(newTrainingRoutine.user.id)
newTrainingRoutine.user = user
return trainingRoutineRepository.save(newTrainingRoutine)
И хранилище для ресурсов выглядит так:
@RestResource(exported = false)
public interface UserRepository: CrudRepository<User, Int> {
}
У меня есть несколько вопросов:
1 - я не могу заставить его работать, отправив userId: 1
в полезную нагрузку запроса. Только если я отправлю user: { "id": 1 }
. Что я могу сделать, чтобы заставить его работать с userId: 1
2- Есть ли способ избежать ручного поиска пользователя и установки его в экземпляр trainingRoutine?
3- Есть ли совершенно другой и лучший способ справиться с этим? Это кажется довольно простым запросом, и я уверен, что есть простой и элегантный способ выполнить sh это