Spring Rest: невозможно вставить строки с столбцом @ManyToOne

Я следую учебному пособию по началу работы в https://spring.io/guides/gs/accessing-data-rest/

Я добавил еще одну книгу сущностей, которая имеет отношение @ManyToOne к сущности Person. Сущность Person имеет новое свойство bikes и имеет отношение @OneToMany с сущностью Bike. Единственное, что отличается от проекта начала работы - это новый атрибут с его методами get и set:

package hello;

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Person {

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

    private String firstName;
    private String lastName;

    @OneToMany
    private List<Bike> bikes;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public List<Bike> getBikes() {
        return bikes;
    }

    public void setBikes(List<Bike> bikes) {
        this.bikes = bikes;
    }
}

Entity Bike описан ниже:

package hello;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class Bike {

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

    private String name;

    @ManyToOne
    @JoinColumn(nullable = false)
    private Person person;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }
}

PersonRepository.java не изменился из учебника:

package hello;

import java.util.List;

import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {

    List<Person> findByLastName(@Param("name") String name);

}

BikeRepository.java - это новый репозиторий, который я создал и который обрабатывает запросы Bike:

package hello;

import java.util.List;

import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource(collectionResourceRel = "bikes", path = "bikes")
public interface BikeRepository extends PagingAndSortingRepository<Bike, Long> {
    List<Bike> findByName(@Param("name") String name);
}

Выглядит довольно просто, верно? Я должен быть в состоянии создать нового человека с помощью curl (как в учебнике):

curl -i -X POST -H "Content-Type:application/json" -d "{  \"firstName\" : \"Frodo\",  \"lastName\" : \"Baggins\" }" http://localhost:8080/people

И это работает:

Сообщение на localhost: 8080 / person, создающее новый объект Person

Однако, когда я пытаюсь добавить новый велосипед с помощью команды curl:

curl -i -X POST -H "Content-Type:application/json" -d "{  \"name\" : \"Frodos Bike\",  \"person\" : {  \"firstName\" : \"Frodo\",  \"lastName\" : \"Baggins\" } }" http://localhost:8080/bikes

Я получаю следующую ошибку:

введите описание изображения здесь

Я получаю ту же ошибку даже при правильном указании person_id:

curl -i -X POST -H "Content-Type:application/json" -d "{  \"name\" : \"Frodos Bike\",  \"person_id\" : \"1\" }" http://localhost:8080/bikes

Мой вопрос: как я могу добавить новый велосипед?

2 ответа

Решение

Ваш BikeRepository не может знать, какой row представлен Person : { firstName : "Frodo", lastName : "Baggins" }, Вы должны сообщить своему BikeRepository, как и где запросить это.

Пытаться

curl -i -X POST -H "Content-Type:application/json" -d "{ \"name\" : \Frodos Bike\", \"person\" : "http://localhost:8080/people/1" }" http://localhost:8080/bikes

Что вроде будет запрос http://localhost:8080/people/1 для Person Entity,

Он также будет работать с запросами на основе параметров, просто замените {id} запрос с http://localhost:8080/people?name='Frodo'

Надеюсь, это поможет!

Попробуй с curl -i -X POST -H "Content-Type:application/json" -d "{ \"name\" : \"Frodos Bike\", \"person\" : \"/people/1\" }" http://localhost:8080/bikes

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