Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不应命名云端点参数_Java_Javascript_Google App Engine_Google Api_Google Cloud Endpoints - Fatal编程技术网

Java 不应命名云端点参数

Java 不应命名云端点参数,java,javascript,google-app-engine,google-api,google-cloud-endpoints,Java,Javascript,Google App Engine,Google Api,Google Cloud Endpoints,我想从JS应用程序向我的谷歌应用程序发送一个HashMap。我创建了一个HashMapContainer类,如:。 端点方法的定义如下: public Entity myMethod( @Named('param1') String param1, @Nullable @Named('param2') HashMapContainer param2) { //... } 运行API生成时,会发生以下错误: com.google.api.server.s

我想从JS应用程序向我的谷歌应用程序发送一个
HashMap
。我创建了一个
HashMapContainer
类,如:。

端点方法的定义如下:

public Entity myMethod(
        @Named('param1') String param1, 
        @Nullable @Named('param2') HashMapContainer param2) {
    //...
}
运行API生成时,会发生以下错误:

com.google.api.server.spi.config.validation.ApiConfigInvalidException: 
    Resource type 'class com.mason.server.entity.HashMapContainer' 
    in method 'endpoint.myMethod' should not be named.
因此,我删除了名为的注释。API已经生成,但很明显,我没有收到JS应用程序发送的参数。我的JavaScript是这样的:

function doTransaction() {
    var req = gapi.client.myApi.endpoint.myMethod({
        'param1': 'FOO',
        'param2': {
            'value1':'foofoo',
            'value2':'barbar',
            'value3':'foobar'
        }
    });
    req.execute(function(data) {
        console.log(data);
    });
}
如果不允许我使用
@Named
注释,我如何获得
参数2
也许我的JavaScript错了?

谷歌云Enpoints说:

@Named:此注释指示 在这里被注入的请求。未注释的参数 将@Named与整个请求对象一起注入

基本上,据我所知,当您添加
@Named
注释时,参数将包含在请求URL的末尾:

http://end_point_url?parameter1=xxx&parameter2=yyy
显然,支持
@Named
注释的参数类型只有少数(我认为是int、long、String、Boolean及其对应的数组),因为您无法将整个hashmap附加到请求URL

另一方面,如果不使用
@Named
,则参数将包含(注入)在POST数据中

为了使用Google API Client Library for JavaScript在HTTP正文中发送参数,您只需将该参数包含到JSON-RPC请求中名为
resource
的对象中,如下所示:

var req = gapi.client.myApi.endpoint.myMethod({
    'param1': 'FOO',
    'resource': {
        'param2': {
            'value1':'foofoo',
            'value2':'barbar',
            'value3':'foobar'
        }
    }
});
API客户端将在URL中自动发送
param1
,在POST数据中自动发送
param2

这在Google API客户端库的JavaScript文档中有详细解释。

中的示例以与代码显示不同的顺序显示注释

public Entity myMethod(
    @Named('param1') String param1, 
    Map<String, Object> param2) {

    System.out.println(param1); // FOO
    System.out.println(String.valueOf(param2.get("value1"))); // foofoo
    System.out.println(String.valueOf(param2.get("value2"))); // barbar
    System.out.println(String.valueOf(param2.get("value3"))); // foobar

    //...
}
公共资源获取(@Named(“id”)@Nullable int-id){…}

所以根据这个,你的

@Nullable@Named('param2')HashMapContainer param2{

应该成为

@Named('param2') @Nullable HashMapContainer param2) {

我用两种方法测试了它——只有后者似乎对我有效。

从我提出这个问题的那天起,我就找到了“另一种方法”来使用。通过遵循文档,我们可以很简单地了解如何从JavaScript脚本发送HashMap(实际上是对象)

定义

对于传递给服务器端方法的所有非实体类型参数,都需要@Named注释。此注释指示此处注入的请求中的参数名称。未使用@Named注释的参数将注入整个请求对象。


JavaScript 我们通过RESTAPI发送一个JS对象

function doSomething() {
    var req = gapi.client.myApi.myMethod({
        'param1': 'FOO',
        'value1': 'foofoo',
        'value2': 'barbar',
        'value3': 'foobar'
    });
    req.execute(function(data) {
        console.log(data);
    });
}

应用程序接口 我们在Java映射中接收所有未注释的参数,它们在HTTP请求体中发送(如文档中所述)

公共实体myMethod(
@命名('param1')字符串param1,
地图参数(2){
System.out.println(param1);//FOO
System.out.println(String.valueOf(param2.get(“value1”));//fooo
System.out.println(String.valueOf(param2.get(“value2”));//barbar
System.out.println(String.valueOf(param2.get(“value3”));//foobar
//...
}
注意,名称“param2”对客户端并不重要,它可以命名为“resources”


此示例不是最佳实践,而是将请求中的参数和数据发送到正文中的最简单方法。您可以使用自己的类(而不是Java Map接口)进行改进,并在需要时添加。如果使用实体作为参数,请确保注释顺序(
@named
必须是第一个).

使用HashMap将获得传递给Api方法的所有参数,我建议您使用
HaspMap
作为param2映射类型, 然后,它通知我们,在这个hashmap中,我们可以使用param2作为hashmap的键。然后,我们可以将param键的值强制转换为hashmap,然后我们可以像最初传递的普通初始hashmap一样对其进行循环

HashMap <String,String> mapR = (HashMap <String,String>) param2.get("param2");

        for(Map.Entry<String,String> x:mapR.entrySet()){
            log.log(Level.INFO,x.getKey()+","+x.getVaue());

        }
HashMap-mapR=(HashMap)param2.get(“param2”);
对于(Map.Entry x:mapR.entrySet()){
log.log(Level.INFO,x.getKey()+”,“+x.getVaue());
}

在过去的三个小时里,由于您的解决方案不起作用,我一直在拼命想让它起作用。我最终通过这样做使它起作用:
var req=gapi.client.myApi.endpoint.myMethod({'param1':'FOO','value1':'fooo''value2':'barbar})
这毫无意义,但很有效。你知道为什么你的解决方案对我不起作用吗?嗨,事实上,我没有使用注释
@named
,所有没有名称的参数都作为HashMap接收。我会写一个答案来解释这一点。