有没有一种方法可以;期望;JavaScript代码中特定Java类的实例?
假设我有Java中的Foo.class:有没有一种方法可以;期望;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)代码中,请
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];
}
}
};
}
);