简体   繁体   English

如何在springboot的requestbody中使用两个不同节点的map单个实体

[英]How to map single entity with two different node in requestbody in springboot

I am using springboot app and I want to map request body User having fields billingAddress and shippingAddress.我正在使用 springboot 应用程序,我想要 map 请求主体用户具有字段 billingAddress 和 shippingAddress。 I have define single Address class given below.我已经定义了下面给出的单个地址 class。 Request body is given below.请求正文如下。 How would I define mapper so that request body can be easily transform?我将如何定义映射器以便可以轻松转换请求主体? I don't want to define separate billingAddress and shippingAddress class.我不想定义单独的 billingAddress 和 shippingAddress class。

Json Request: Json 请求:

{
  "data": {
    "billing_information": {
      "billing_first_name": "John",
      "billing_last_name": "Doe",
      "billing_address_line1": "1295 Charleston Road",
      "billing_address_line2": "Apt 1",
      "billing_city": "Mountain View",
      "billing_province": "CA",
      "billing_postal_code": "94043",
      "billing_country": "US"
    },
    "shipping_information": {
      "shipping_first_name": "John",
      "shipping_last_name": "Doe",
      "shipping_address_line1": "1295 Charleston Road",
      "shipping_address_line2": "Apt 1",
      "shipping_city": "Mountain View",
      "shipping_province": "CA",
      "shipping_country": "US",
      "shipping_postal_code": "94043"
    }
  }
}

Address.java:地址.java:

public class Address {
    private String firstName;
    private String lastName;
    private String addressLne1;
    private String addressLne2;
    private String city;
    private String province;
    private String postalCode;
    private String country;
}

User.java:用户.java:

public class User {
    private Address billingAddress;
    private Address shippingAddress;
}

Controller.java: Controller.java:

@RestController
public class Controller {
    @PostMapping("/user")
    public String user(@RequestBody User request) {

        return "success";
    }
 }

First, the root node of a JSON has a property 'data', you can map using @JsonTypeName , other alternative is to create a wrapper class and map it using @JsonProperty to a mapper field首先,JSON 的根节点有一个属性“数据”,您可以使用@JsonTypeName ,另一种方法是使用@JsonProperty到映射器字段创建包装器 class 和 map

Then you can map the billing address and shipping address using @JsonProperty annotation然后你可以使用@JsonProperty注释 map 账单地址和送货地址

@JsonTypeName("data")
@JsonTypeInfo(include= JsonTypeInfo.As.WRAPPER_OBJECT,use= JsonTypeInfo.Id.NAME)
class User {

    @JsonProperty("billing_information")
    private Address billingAddress;

    @JsonProperty("shipping_information")
    private Address shippingAddress;
    
    // getters and setters
}

And finally, as Address model fields need to be mapped to 2 different JSON properties, we can use @JsonAlias to set an alias.最后,由于Address model 字段需要映射到 2 个不同的 JSON 属性,我们可以使用@JsonAlias设置别名。

class Address {

    @JsonProperty("billing_first_name")
    @JsonAlias({"shipping_first_name"})
    private String firstName;

    @JsonProperty("billing_last_name")
    @JsonAlias({"shipping_last_name"})
    private String lastName;

    @JsonProperty("billing_address_line1")
    @JsonAlias({"shipping_address_line1"})
    private String addressLne1;

    ...

    // getters and setters
}

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

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