spring boot中请求json正文中存在变量键值时处理RequestBody

Posted

技术标签:

【中文标题】spring boot中请求json正文中存在变量键值时处理RequestBody【英文标题】:Handling a RequestBody when there are variable key-value in the request json body in spring boot 【发布时间】:2017-08-22 15:41:37 【问题描述】:

我是 Java 开发的新手,但我已经在 php 和 Python 上开发了几个生产就绪的应用程序。我正在使用 spring boot 框架开发一个 REST api,并发现在处理/解析请求正文方面几乎没有混淆。在我研究过的其他语言中,它要简单得多。

如果它在 python/php 中,我不需要明确定义请求的所有参数来处理请求正文。但是在 java 中,我必须在 POJO 类中预定义所有请求参数并对其进行映射。因此,对于我创建的每个 API 端点,我都必须在 Java 类中将所有端点定义为数据层。

但在其他语言中,我不需要将任何内容映射到数组,在 php $_POST 中保存数据对象。

我的问题是

我有以下要求

1.

  "category": "product/invoice/event",
  "item_id": "Unique tool identifier id",
  "platforms_id": "1",
  "share_platform_settings": 
    "fb_share_type": "page/profile",
    "fb_share_name": "profilename/pagename",
    "fb_id": "fb_uid/page_id"
  


2.

  "category": "product/invoice/event",
  "item_id": "Unique tool identifier id",
  "platforms_id": "1",
  "share_platform_settings": 
    "twitter_username": "page/profile",
    "twitter_user_access_token": "profilename/pagename"
  

我写了一门课

import com.google.common.base.Objects;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
public class User 

    @Id
    @NotNull
    @Size(max = 64)
    @Column(name = "id", nullable = false, updatable = false)

    private String id;

    private String category;

    private String item_id;

    private String platforms_id;

    private String fb_share_type;

    private String fb_share_name;

    private String fb_id;


    User() 
    

    public User(final String id, final String category,final String item_id,final String platforms_id,final String fb_share_type,final String fb_share_name,final String fb_id) 
        this.id = id;
        this.category = category;
        this.item_id = item_id;
        this.platforms_id = platforms_id;
        this.fb_share_type = fb_share_type;
        this.fb_share_name = fb_share_name;
        this.fb_id = fb_id;
    

    public String getId() 
        return id;
    

    public String getCategory() 
        return category;
    

    public String getItemId() 
        return item_id;
    

    public String getFbShareType() 
        return platforms_id;
    

    public String getFbShareName() 
        return category;
    

    public String getFbId() 
        return category;
    

    public String setCategory(String category) 
        return this.category = category;
    


    public void setId(String id) 
        this.id = id;
    

    public void setItemId(String item_id) 
        this.item_id = item_id;
    

    public void setFbShareType(String fb_share_type) 
        this.fb_share_type = fb_share_type;
    

    public void setFbShareName(String fb_share_name) 
        this.fb_share_name = fb_share_name;
    

    public void setFbId(String fb_id) 
        this.fb_id = fb_id;
    

    @Override
    public String toString() 
        return Objects.toStringHelper(this)
                .add("id", id)
                .add("item_id", item_id)
                .add("fb_share_type", fb_share_type)
                .add("fb_share_name", fb_share_name)
                .add("fb_id", fb_id)
                .add("category", category)
                .toString();
    

我可以使用@RequestBody Request request 将请求映射到类, 但我已经用我的请求参数定义了类请求。但是我的请求参数不断变化,我有不同的 json 请求结构 2. 在这种情况下我会怎么做?如果我在同一个 API 上有 n 个不同的请求怎么办?我需要为每个人创建类吗?或者定义这个类本身的所有变量?或者无论如何,我不需要任何类,是杰克逊依赖用于那个吗?

对不起,如果这是一个转储问题,我对 Java 开发还很陌生,我非常感谢理解这样的问题:P

【问题讨论】:

您可以使用地图来保存您的请求正文 @Ajeesh 我的回答对你有帮助吗? 【参考方案1】:

当您在 JSON 中使用键/值参数时,您需要在后端使用类似的结构对其进行映射,因此您需要在您的实体中使用 Map 类型的集合,例如 Map<String, String> share_platform_settings

你的实体会是这样的:

@Entity
public class User 

    @Id
    @NotNull
    @Size(max = 64)
    @Column(name = "id", nullable = false, updatable = false)
    private String id;

    private String category;
    private String item_id;
    private String platforms_id;
    private Map<String, String> share_platform_settings;

    //Constructors, getters and setters

这应该适合你。

【讨论】:

以上是关于spring boot中请求json正文中存在变量键值时处理RequestBody的主要内容,如果未能解决你的问题,请参考以下文章

从请求正文 Spring Boot 中删除空属性

如何在 spring-boot Web 客户端中发送请求正文?

请求正文中的 Spring Boot Keycloak 客户端凭据

缺少请求正文的 Spring Boot POST 请求?

控制器方法中 requestBody 上的 Spring Boot @Valid 不起作用

Spring Boot RestController - PostMapping - 将请求正文作为 InputStream [重复]