繁体   English   中英

使用 Spring 引导请求包装器主体

[英]Request Wrapper Body using Spring Boot

我有两个实体代表数据库中的两个表,类似于inheritance的概念:

实体人:

@Entity
@Table(name ="person", schema = "myself")
public class Person implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="person_id")
    private long id;

    @Column(name = "person_name", nullable = false, length = 255)
    @NotNull(message = "name_expects")
    private String name;

    @OneToOne(mappedBy = "person", cascade = CascadeType.ALL, orphanRemoval = false, fetch = FetchType.LAZY)
    @JsonIgnore
    private AdressPerson adressPerson;

... get and setters
}

实体地址:

@Entity
@Table(name ="adress_person", schema = "myself")
public class AdressPerson implements Serializable {

    @Id
    @Column(name = "person_id")
    private long id;

    @Column(name = "type", nullable = false, length = 14)
    private String type;

    @Column(name = "adress", nullable = false, length = 255)
    private String adress;

    @OneToOne(fetch = FetchType.LAZY)
    @MapsId
    private Person person;

... get and setters
}

我需要用这个发送一个请求帖子和表单数据:

{
   "id":1,
   "name":"John Doe",
   "type": "home",
   "adress" : "Madison Ave"
}

在我的 controller 我需要这样接收:

...
@PostMapping(value = "", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}, produces = {MediaType.APPLICATION_JSON_VALUE})
public AdressPerson addAdressPerson(@NotNull @RequestParam AdressPerson adressPersonRequest)  {
    //code
}
...

但是我无法进行映射,我尝试使用过滤器和 RequestWrapper,但我无法覆盖消息正文。 任何人都可以帮助我吗?

谢谢!

Spring 的@RequestParam映射查询参数,例如?name=something&address=some-address

当您尝试发出 POST 请求并希望将 JSON 请求有效负载反序列化为 java class 时。

请改用@RequestBody

在您的 @RestController class 中,您可以定义您的 POST 映射方法,如下所示:

...
@PostMapping(value = "")
public AdressPerson addPerson(@RequestBody Person person)  {
       //code
}
...

默认情况下,您的 spring-boot 项目预期/返回 JSON 主体,因此您可以省略消费和生产属性。

现在为了接收上面 controller 中的有效负载,您的 JSON 请求正文应如下所示 -

{
  "id":1,
  "name":"John Doe",
  adressPerson": {
      "type": "home",
      "adress" : "Madison Ave"
   }
}

此外,在您的实体 Person 中,从 adressPerson 字段中删除 @JsonIgnore,而是尝试使用 @JsonManagedReference 和 @JsonBackReference。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM