java - 适用于 Java 的 Google Cloud Endpoints Frameworks 未在输入对象中设置值
问题描述
我有一个像这样开头的 Cloud Endpoints 方法:
@ApiMethod(httpMethod = HttpMethod.POST, path = "kokoers")
public Kokoer createKokoer(Kokoer kokoer, User user) throws UnauthorizedException, BadRequestException {
logger.info(new ObjectMessage("kokoer: " + kokoer));
我正在用 curl 测试它,如下所示:
curl --request POST --header "content-Typ: application/json" -H "Authorization: Bearer <JWT token>" --data '{"kokoerName":"Danny Dwob", "emailAddress":"me@there"}' http://localhost:8080/_ah/api/kokodokoapi/v1/kokoers/
我的方法记录的消息是:
09:32:08.940 [qtp2009787198-57] INFO uk.co.scapps.kokodoko.api.KokodokoAPI - kokoer: Kokoer [kokoer_id=null, kokoerName=null, no. of kokos=0, periods=[], emailAddress=null, kokoSharingPolicy=null]
我期待 kokoerName 和 emailAddress 会有非空值。
我的 openapi.json 文件中的路径定义如下所示:
"paths": {
"/kokodokoapi/v1/kokoers": {
"post": {
"operationId": "KokodokoapiCreateKokoer",
"parameters": [
{
"in": "body",
"name": "body",
"required": false,
"schema": {
"$ref": "#/definitions/Kokoer"
}
}
],
"responses": {
"200": {
"description": "A successful response",
"schema": {
"$ref": "#/definitions/Kokoer"
}
}
},
"security": [
{
"firebase": []
}
],
"x-security": [
{
"firebase": {
"audiences": [
"<project id>"
]
}
}
]
}
},
该文件中的 Kokoer 定义如下所示:
"Kokoer": {
"properties": {
"emailAddress": {
"type": "string"
},
"kokoSharingPolicy": {
"$ref": "#/definitions/KokoSharingPolicy_E"
},
"kokoerName": {
"type": "string"
},
"kokoer_id": {
"type": "integer",
"format": "int64"
},
"kokos": {
"type": "array",
"items": {
"$ref": "#/definitions/Koko"
}
},
"periods": {
"type": "array",
"items": {
"$ref": "#/definitions/KokoPeriod"
}
}
}
}
Kokoer 类定义的相关(据我了解;很高兴得到纠正)部分如下所示:
package uk.co.scapps.kokodoko.datamodel;
import java.util.HashSet;
import java.util.Set;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonManagedReference;
@Entity(name="Kokoer")
@Table(name="kokoer")
public class Kokoer {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(updatable = false, nullable = false)
private Long kokoer_id;
private String kokoerName;
@OneToMany(mappedBy = "kokoer")
@JsonManagedReference
private Set<Koko> kokos = new HashSet<Koko>();
. . .
public String getKokoerName() {
return this.kokoerName;
}
public void setKokoerName(String kokoerName) {
this.kokoerName = kokoerName;
}
public Kokoer() {
super();
// TODO Auto-generated constructor stub
}
}
考虑到输入 Kokoer 对象具有所有空字段值而不是我从 curl 传入的值,该方法完全按预期运行。
到目前为止,我在项目中有另一种 API 方法用于创建类似类型的对象。它的结构非常相似,并且按预期工作,包括来自 curl 的输入值出现在输入对象中。我无法发现两者之间的结构差异来解释不同的行为。
有什么想法吗?
谢谢。
-担
解决方案
没有代码更改。今天工作(重新启动机器后)。难住了。
更新:更多报告在这里。再次出现没有调用 setter 来初始化 post 方法上的实体的问题。
想查看请求正文的内容,但流只能读取一次。所以,添加了这个过滤器:
https://gist.github.com/calo81/2071634
现在 API 方法有效(正在设置值)。
如果我在 web.xml 中注释掉过滤器,我的 API 方法将再次停止工作,当我重新激活过滤器时,我的 API 方法再次按预期工作。这在几次迭代中始终如一地发生。
虽然我在云应用引擎(标准 v1)上看到了同样的问题,但到目前为止,我只在本地应用引擎上尝试了过滤器解决方法。
推荐阅读
- javascript - 使用 App 脚本,想要创建具有月份名称的批量工作表并在每个月表中插入具有周名称的子工作表,但显示错误
- json - 获取null而不是字符串列表flutter json
- reactjs - 组件内的第二个 React Router Swtich 无法正常工作
- gstreamer - 无法通过 GStreamer udpsrc 元素获取音频
- django - Django,“render”在 POST 请求后返回 POST 请求而不是 GET
- openbravo - 如何访问本地安装的 Openbravo
- amazon-web-services - 在 ECR 中标记多平台图像会创建未标记的清单
- html - 通过 html 片段嵌入的应用程序
- ruby-on-rails - Rails - 将时间数据类型列中的值转换为秒并获取它们的总和
- python - 用 numpy 处理缺失数据以集中不同的形状数组