POST / PUT 上的 Java Spring REST API 状态 400 响应
Posted
技术标签:
【中文标题】POST / PUT 上的 Java Spring REST API 状态 400 响应【英文标题】:Java Spring REST API Status 400 response on POST / PUT 【发布时间】:2016-11-28 17:47:31 【问题描述】:我使用 Java Spring Cloud / Boot 构建了一个 REST API 服务。首先,我创建了一个连接到 MongoDB 的简单类和一个带有服务的控制器,该服务应该允许我添加、删除、更新和获取所有对象。使用 POSTMAN 时,这些都可以工作,但是当我想使用 redux 和 fetch API 添加或更新对象时,我会收到状态 400 和“错误请求”错误。这似乎与我在正文中发送的 JSON 有关,但它与例如 POSTMAN 使用的 JSON 格式完全相同。
我在 Redux 中的操作。为了简单/测试目的,我在顶部添加了一个对象,而不是使用从页面发送的对象。
var assetObject =
"vendor" : "why dis no work?",
"name": "wtf",
"version": "231",
"category" : "qsd",
"technology" : "whatever"
export function addAsset(access_token, asset)
return dispatch =>
fetch(constants.SERVER_ADDRESS + '/as/asset/add',
method: 'POST',
credentials: 'include',
headers:
'Authorization': 'Bearer' + access_token,
'Content-Type': 'application/json'
,
body: assetObject
)
.then(res => dispatch(
type: constants.ADD_ASSET,
asset
))
Java Spring 中的控制器代码:
@RequestMapping(method = RequestMethod.POST, path = "/add")
public void addAsset(@RequestBody Asset asset)
assetService.addAsset(asset);
在邮递员中进行时状态正常:
我在使用 Redux / Fetch API 时遇到的错误(我只删除了目录结构,因为其中包含公司名称):
已经坚持了一段时间,非常感谢任何帮助!
编辑资产对象:
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "assets")
public class Asset
@Id
private String id;
private String vendor;
private String name;
private String version;
private String category;
private String technology;
public Asset()
public Asset(String id,
String vendor,
String name,
String version,
String category,
String technology)
this.id = id;
this.vendor = vendor;
this.name = name;
this.version = version;
this.category = category;
this.technology = technology;
public String getId()
return id;
public String getVendor()
return vendor;
public String getName()
return name;
public String getVersion()
return version;
public String getCategory()
return category;
public String getTechnology()
return technology;
public void setId(String id)
this.id = id;
public void setVendor(String vendor)
this.vendor = vendor;
public void setName(String name)
this.name = name;
public void setVersion(String version)
this.version = version;
public void setCategory(String category)
this.category = category;
public void setTechnology(String technology)
this.technology = technology;
【问题讨论】:
你能复制/粘贴你的资产 java 对象吗? 你的 json 中缺少 ID,因此得到 400。你能告诉我结果吗? 不,没关系,如果我不提供 id,mongoDB 只会创建一个。 对我来说,Spring 似乎拒绝了您的请求,因为它无法将您的 json 放入您的对象中,因为您没有在 json 中提供任何 ID 字段 不确定 fetch API 的工作原理。您是否尝试将正文格式化为 json?正文:JSON.stringify(assetObject)? 【参考方案1】:你的错误信息说:
;缺少所需的请求正文
我认为错误发生在您的 controller
方法时
试图从传入的请求中形成一个对象。
当您发送请求时,您必须set
每个与对象相关的字段。
如果您打算不设置属性,则应使用 @JsonIgnore
注释标记该字段。
您可以在将忽略此属性的变量上使用@JsonIgnore
注释
在形成对象时以及在输出对象时。
在 setter method
上使用 @JsonIgnore
注释,我认为你现在应该这样做
您在提出请求时忽略了id property
。
@JsonIgnore
public void setId(String id)
this.id = id;
你可以从controller method
返回httpstatus
代码,
以便客户端知道请求成功
@ResponseBody
public ResponseEntity<String> addAsset(@RequestBody Asset asset)
return new ResponseEntity<String>("your response here", HttpStatus.OK);
【讨论】:
以上是关于POST / PUT 上的 Java Spring REST API 状态 400 响应的主要内容,如果未能解决你的问题,请参考以下文章
PUT 和 POST 在未知属性上失败 Spring 不同的行为
如何在 Spring Security 中启用 POST、PUT 和 DELETE 方法
Spring 框架:返回所有 METHODS 的 HTTP OPTIONS(get、put、post、delete、trace、head、options)