如何从 Json 对象更新 Java (Ebean) 对象

How to update a Java (Ebean) Object from a Json Object

我已经知道如何使用以下代码从 Json 创建对象 :

SomeClass someObject  = Json.fromJson(someJsonNode, SomeClass.class);

我也知道如何 save()update() 一个 ebean 对象。

我想做的是更新现有对象来自Json节点中的数据,一些东西看起来像这样:

SomeClass someObject = fetchMyObjectFromDb();
someObject.updateFromJson(someJsonNode);

SomeClass someObject = fetchMyObjectFromDb();
Json.updateFromJson(someJsonNode,someObject);

在我的特定情况下,该对象是一个 Ebean 实体,也许这会有所帮助,但我没有找到从 Ebean 到那个的任何辅助方法。

我的 Json.* 工具与 Google Gson 非常相似,但我也找不到我想要的东西。

我是否必须使用 Java 反思自己编写代码,或者是否有更简单的 way/tool 来做到这一点?

编辑:我也很高兴有一种简单的方法来更新 Ebean 实体的多个属性。我找不到 myEbeanObject.set("attributeName",value) 形式的简单 "set" ?

我想您的 SomeClass 扩展了 ebean 的 Model,对吗? Modelsave() method。如果对从数据库中获取的对象调用 save(),它将被更新,如果对新对象调用它,它将被保存到数据库中。

所以你可以简单地调用save()方法。

如果您将 ebean 与 Play Framework 一起使用,您还可以通过 update() method.

更新您的模型

如果有人感兴趣,这就是我最后所做的。小型实用方法,使用 java 反射从同一 class 的另一个 java 对象更新 java 对象:

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public <T> void updateObjFromObj(T objToUpdate, T objToUse)
        throws IllegalAccessException {
    Class<?> clazz = objToUpdate.getClass();

    while (clazz != null) {
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {
            if (!Modifier.isStatic(field.getModifiers())) {
                boolean accessible = field.isAccessible();
                field.setAccessible(true);
                if (field.get(objToUse) != null) {
                    field.set(objToUpdate, field.get(objToUse));
                }
                field.setAccessible(accessible);
            }
        }

        clazz = clazz.getSuperclass();
    }
}

仅当新值不为空时才更新字段。可以按如下方式使用从 Json :

更新 ebean 对象
SomeClass someObjectToUpdate = fetchMyObjectFromDb();
SomeClass objectToUse  = Json.fromJson(someJsonNode, SomeClass.class);
updateObjFromObj(someObjectToUpdate, objectToUse);
someObjectToUpdate.save();

Edit/Update :如果您使用它来更新 ebean 对象,则需要使用 setter 和 getter 将更改持久保存到数据库中。

因此您可以在字段循环之前添加:

PropertyAccessor objToUpdateAccessor = PropertyAccessorFactory.forBeanPropertyAccess(objToUpdate);

然后代替:

field.set(objToUpdate, field.get(objToUse));

使用:

objToUpdateAccessor.setPropertyValue(field.getName(), field.get(objToUse));