【问题标题】:Handling a RequestBody when there are variable key-value in the request json body in spring bootspring boot中请求json正文中存在变量键值时处理RequestBody
【发布时间】: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 我的回答对你有帮助吗?

标签: java json spring spring-mvc spring-boot


【解决方案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
}

这应该适合你。

【讨论】:

    猜你喜欢
    • 2020-03-14
    • 2019-09-11
    • 1970-01-01
    • 2019-05-12
    • 2018-02-23
    • 1970-01-01
    • 2021-11-12
    • 2016-10-31
    相关资源
    最近更新 更多