有没有办法在javascript代码中“期望”某个java类的示例?

6ioyuze2  于 2021-07-13  发布在  Java
关注(0)|答案(4)|浏览(288)

假设java中有foo.class:

public class Foo {
    public int id;
    public String data;
}

我在javascript中有foo“class”:

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: Property description must be an object: true 当然,总是有可能将javascript端foo构造函数重构为:

function Foo(foo) {
    this.id = foo.id;
    this.data = foo.data;
}

但是,这需要重构大部分代码库。
谢谢你的时间。我很感激!
ps:对于那些想知道为什么我需要这个的人来说:对于像foo这样的小班来说,这不是问题,但是一些响应是一个更大的类(有十几个字段)的示例,它们不在我的控制之下。
编辑:我接受了chichozell的答案,仅仅是因为它需要最少的工作量。robin和jonnyknowsbest的答案也很有效(而且适用于纯javascript,不像chichozell的答案,后者是特定于angularjs的)。我还没试过劳伦提的答案,但看起来应该也有用。无论如何,这是一个解决方案(不是解决方案):

.success(function (response) {
    var foo = new Foo();
    angular.extend(foo, response); // angular.merge() for "deep-copy"
    //...
}

非常感谢所有在这篇文章中回答/评论/编辑的人。

hpcdzsge

hpcdzsge1#

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

this = angular.extend(this, response)

在foo函数中,或直接在控制器上:

Foo = angular.extend(Foo, response)
sf6xfgos

sf6xfgos2#

您可以这样做来“反序列化”作为对初始化对象的响应而收到的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"
    }
}
t5fffqht

t5fffqht3#

如果你想的话,你可以把它做得很普通。而且不会有太多的重构要做,这个解决方案将减轻您将来对这两个类的更改。
您可以将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之类的方法(通过遍历对象的属性,不管它是数组还是对象),使创建新服务更安全;hasNullValue等等。
希望这有帮助,你看到它的价值。

uhry853o

uhry853o4#

您还可以执行类似于jsfiddle的操作来实现所描述的结构。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参数。
查看jsfiddle控制台日志输出,您会发现它是有效的。
您还可以从jsfiddle中看到,删除对hasownproperty的检查,以设置响应中的所有属性,而不管javascript函数是否定义了这些属性。

相关问题