spring-data-rest集成测试因简单的json请求而失败

Ach*_*ius 24 java integration-testing spring-data-jpa spring-data-rest spring-boot

我的spring-data-rest集成测试因简单的json请求而失败.考虑下面的jpa模型

Order.java

public class Order {

    @Id @GeneratedValue//
    private Long id;
    @ManyToOne(fetch = FetchType.LAZY)//
    private Person creator;
    private String type;

    public Order(Person creator) {
        this.creator = creator;
    }

    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

Person.java

ic class Person {

    @Id @GeneratedValue private Long id;

    @Description("A person's first name") //
    private String firstName;

    @Description("A person's last name") //
    private String lastName;

    @Description("A person's siblings") //
    @ManyToMany //
    private List<Person> siblings = new ArrayList<Person>();

    @ManyToOne //
    private Person father;

    @Description("Timestamp this person object was created") //
    private Date created;

    @JsonIgnore //
    private int age;

    private int height, weight;
    private Gender gender;

    // ... getters and setters
}
Run Code Online (Sandbox Code Playgroud)

在我的测试中,我通过传递人员使用personRepository和inited命令创建了一个人

Person creator = new Person();
creator.setFirstName("Joe");
creator.setLastName("Keith");
created.setCreated(new Date());
created.setAge("30");
creator = personRepository.save(creator);

Order order = new Order(creator);
String orderJson = new ObjectMapper().writeValueAsString(order);

mockMvc.perform(post("/orders").content(orderJson).andDoPrint());
Run Code Online (Sandbox Code Playgroud)

订单已创建,但创建者未与订单关联.另外我想将请求体传递为json对象.在这个我的json对象应该包含如下创建者

{
"type": "1",
"creator": {
    "id": 1,
    "firstName": "Joe",
    "lastName": "Keith",
    "age": 30
}
}
Run Code Online (Sandbox Code Playgroud)

如果我使用以下json发送请求正文,则调用正常

{
"type": "1",
"creator": "http://localhost/people/1"
}
Run Code Online (Sandbox Code Playgroud)

但我不想发送第二个json.任何想法如何解决问题.因为我的客户端已经通过发送第一个json来消耗服务器响应.现在我迁移了我的服务器以使用spring-data-rest.之后我的所有客户端代码都无法运行.

怎么解决这个?

yt6*_*t61 7

您正确地将订单与创建者关联,但是Person与订单无关.您缺少List<Order> ordersPerson类中的字段.添加此项,添加注释,添加向人员添加订单的方法,然后在发送JSON之前,您应该调用以下内容:

creator.addOrder(order);
order.setCreator(cretr);
Run Code Online (Sandbox Code Playgroud)


so-*_*ude 7

您是否尝试过使用cascade = CascadeType.ALL@ManyToOne注释?

public class Order {
    @Id @GeneratedValue//
    private Long id;
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)//
    private Person creator;
    private String type;

    public Order(Person creator) {
        this.creator = creator;
    }

    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)