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 Web 客户端中发送请求正文?
请求正文中的 Spring Boot Keycloak 客户端凭据
控制器方法中 requestBody 上的 Spring Boot @Valid 不起作用
Spring Boot RestController - PostMapping - 将请求正文作为 InputStream [重复]