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

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

假设java中有foo.class:

  1. public class Foo {
  2. public int id;
  3. public String data;
  4. }

我在javascript中有foo“class”:

  1. function Foo(id, data) {
  2. this.id = id;
  3. this.data = data;
  4. }

另外,假设我有一个java控制器,它返回foo.class的示例作为对rest请求的响应。在我的javascript(angularjs)代码中,请求被发送为:

  1. $http.get(url + 'bar/get-foo/')
  2. .success(function (response) {
  3. var foo = new Foo(response.id, response.data);
  4. logger.info("SUCCESS: /get-foo");
  5. })
  6. .error(function (error_message) {
  7. logger.error(error_message)
  8. });

而且很有效。但是有没有一种方法可以避免将响应中的每个属性传递给foo构造函数(某种程度上需要foo对象,或者将其强制转换为foo对象)?
我试过用 Object.create(Foo, response) 但我明白了 TypeError: Property description must be an object: true 当然,总是有可能将javascript端foo构造函数重构为:

  1. function Foo(foo) {
  2. this.id = foo.id;
  3. this.data = foo.data;
  4. }

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

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

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

hpcdzsge

hpcdzsge1#

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

  1. this = angular.extend(this, response)

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

  1. Foo = angular.extend(Foo, response)
sf6xfgos

sf6xfgos2#

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

  1. function JSONToObj(jsondata) {
  2. var json = JSON.parse(jsondata);
  3. var name = null;
  4. for(var i in json) { //Use first property as name
  5. name = i;
  6. break;
  7. }
  8. if (name == null)
  9. return null;
  10. var obj = new window[name]();
  11. for(var i in json[name])
  12. obj[i] = json[name][i];
  13. return obj;
  14. }

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

  1. {
  2. "Foo": {
  3. "id": "the id",
  4. "data": "the data"
  5. }
  6. }
展开查看全部
t5fffqht

t5fffqht3#

如果你想的话,你可以把它做得很普通。而且不会有太多的重构要做,这个解决方案将减轻您将来对这两个类的更改。
您可以将foo javascript对象更改为angular js服务,并在需要时将其注入到任何地方。这样,您就可以在全球范围内获得数据。它比局部变量foo好。

  1. yourApp.factory('Foo',
  2. function () {
  3. //set a default or just initialize it
  4. var fooObject= {};
  5. return {
  6. getId: function () { return fooObject.id; },
  7. getData: function() { return fooObject.data;},
  8. setId: function(newId){fooObject.id = newId},
  9. setData: function(newData){fooObject.data=newData;},
  10. initializeFromObject : function(response){
  11. for (var prop in response){
  12. fooObject[prop] = response[prop];
  13. }
  14. }
  15. };
  16. }
  17. );

您还可以使用hasallproperties之类的方法(通过遍历对象的属性,不管它是数组还是对象),使创建新服务更安全;hasNullValue等等。
希望这有帮助,你看到它的价值。

展开查看全部
uhry853o

uhry853o4#

您还可以执行类似于jsfiddle的操作来实现所描述的结构。createobject函数看起来像下面的代码段。

  1. function createObject(response, toCreate){
  2. var newObject = new toCreate();
  3. for(var attr in response){
  4. if(newObject.hasOwnProperty(attr)){
  5. newObject[attr] = response[attr];
  6. }
  7. }
  8. return newObject;
  9. }

其中createobject将具有与函数相同属性的js对象作为响应参数,将函数(要创建的对象)作为tocreate参数。
查看jsfiddle控制台日志输出,您会发现它是有效的。
您还可以从jsfiddle中看到,删除对hasownproperty的检查,以设置响应中的所有属性,而不管javascript函数是否定义了这些属性。

相关问题