首页 > 解决方案 > 适用于 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 的输入值出现在输入对象中。我无法发现两者之间的结构差异来解释不同的行为。

有什么想法吗?

谢谢。

-担

标签: javagoogle-cloud-platformgoogle-cloud-endpoints

解决方案


没有代码更改。今天工作(重新启动机器后)。难住了。

更新:更多报告在这里。再次出现没有调用 setter 来初始化 post 方法上的实体的问题。

想查看请求正文的内容,但流只能读取一次。所以,添加了这个过滤器:

https://gist.github.com/calo81/2071634

现在 API 方法有效(正在设置值)。

如果我在 web.xml 中注释掉过滤器,我的 API 方法将再次停止工作,当我重新激活过滤器时,我的 API 方法再次按预期工作。这在几次迭代中始终如一地发生。

虽然我在云应用引擎(标准 v1)上看到了同样的问题,但到目前为止,我只在本地应用引擎上尝试了过滤器解决方法。


推荐阅读