Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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
有没有一种方法可以;期望;JavaScript代码中特定Java类的实例?_Java_Javascript_Angularjs_Casting - Fatal编程技术网

有没有一种方法可以;期望;JavaScript代码中特定Java类的实例?

有没有一种方法可以;期望;JavaScript代码中特定Java类的实例?,java,javascript,angularjs,casting,Java,Javascript,Angularjs,Casting,假设我有Java中的Foo.class: public class Foo { public int id; public String data; } 我有JavaScript中的Foo“类”: function Foo(id, data) { this.id = id; this.data = data; } 另外,假设我有一个Java控制器,它返回Foo.class的实例作为对REST请求的响应。在我的JavaScript(AngularJS)代码中,请

假设我有Java中的Foo.class:

public class Foo {
    public int id;
    public String data;
}
我有JavaScript中的Foo“类”:

function Foo(id, data) {
    this.id = id;
    this.data = data;
}
另外,假设我有一个Java控制器,它返回Foo.class的实例作为对REST请求的响应。在我的JavaScript(AngularJS)代码中,请求被发送为:

$http.get(url + 'bar/get-foo/')
    .success(function (response) {
        var foo = new Foo(response.id, response.data);
        logger.info("SUCCESS: /get-foo");
    })
    .error(function (error_message) {
        logger.error(error_message)
    });
它是有效的。但是有没有一种方法可以避免将响应中的每个属性传递给Foo构造函数(某种程度上期望Foo对象,或者将其强制转换为Foo对象)

我尝试使用
Object.create(Foo,response)
但我得到
TypeError:属性描述必须是对象:true

当然,总是有可能将JavaScript端Foo构造函数重构为:

function Foo(foo) {
    this.id = foo.id;
    this.data = foo.data;
}
但是,这需要重构大部分代码库

谢谢你抽出时间。我很感激

PS:对于那些想知道我为什么需要这个的人来说:像Foo这样的小类没有问题,但是一些响应是一个更大的类(有十几个字段)的实例,它们不在我的控制之下

编辑:我接受了Chichozell的答案,只是因为它需要最少的工作量。Robin和jonnyknowsbest的答案也适用(并且适用于纯JavaScript,不同于Chichozell的答案,后者是特定于AngularJS的)。我还没试过Laurentiu L.的答案,但看起来它也应该起作用。 无论如何,这是一个解决方案(不是解决方案):


非常感谢在这个帖子中回答/评论/编辑的每个人。

您可以这样做“反序列化”您收到的JSON,作为对初始化对象的响应:

function JSONToObj(jsondata) {
    var json = JSON.parse(jsondata);

    var name = null;
    for(var i in json) { //Use first property as name
        name = i;
        break;
    }

    if (name == null)
        return null;

    var obj = new window[name]();
    for(var i in json[name])
        obj[i] = json[name][i];

    return obj;
}
这假设构造函数存在于全局范围中,并且响应是JSON格式的:

{
    "Foo": {
        "id": "the id",
        "data": "the data"
    }
}

你也可以做一些事情来达到你描述的结构。createObject函数看起来类似于下面的代码段

function createObject(response, toCreate){
    var newObject = new toCreate();
    for(var attr in response){
        if(newObject.hasOwnProperty(attr)){
            newObject[attr] = response[attr];   
        }
    }
    return newObject;
}
其中createObject将具有与函数相同属性的js对象作为响应参数,将函数(要创建的对象)作为toCreate参数

查看JSFIDLE控制台日志输出,您会发现它是有效的


正如在JSFIDLE中所看到的,您还可以删除对hasOwnProperty的检查,以设置响应中的所有属性,而不管javascript函数是否定义了这些属性。

如果您想让Java继续考虑javascript,请尝试使用angular.extend(),它将一个对象的属性“复制”到另一个对象

this = angular.extend(this, response)
在foo函数中,或直接在控制器上:

 Foo = angular.extend(Foo, response)

如果你想的话,你可以让它变得非常通用。而且不会有太多的重构要做,这个解决方案将简化您将来对这两个类的更改

您可以将Foo-javascript对象更改为Angular JS服务,并将其注入到任何需要的地方。这样,您就可以在全球范围内获得数据。它比局部变量foo好

yourApp.factory('Foo',
        function () {
            //set a default or just initialize it
            var fooObject= {};
            return {
                getId: function () { return fooObject.id; },
                getData: function() { return fooObject.data;},
                setId: function(newId){fooObject.id = newId},
                setData: function(newData){fooObject.data=newData;},

                initializeFromObject : function(response){
                     for (var prop in response){
                          fooObject[prop] = response[prop];
                     }
                }
            };
        }
    );
您还可以使用hasAllProperties之类的方法(通过迭代对象的属性,无论是数组还是对象),使创建新服务更安全;hasnull值等等


希望这有帮助,您会看到它的价值。

您正在作为全局构造函数执行第一个属性…?哦,我想我明白了!也许为了澄清您的答案,请提供一个JSON格式响应的示例。谢谢,我从来都不知道AngularJS的功能。
yourApp.factory('Foo',
        function () {
            //set a default or just initialize it
            var fooObject= {};
            return {
                getId: function () { return fooObject.id; },
                getData: function() { return fooObject.data;},
                setId: function(newId){fooObject.id = newId},
                setData: function(newData){fooObject.data=newData;},

                initializeFromObject : function(response){
                     for (var prop in response){
                          fooObject[prop] = response[prop];
                     }
                }
            };
        }
    );