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

时间:2018-07-27 14:14:11

标签: java json deserialization ebean

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

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

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

我想做的是从JsonNode中的数据更新一个现有对象,看起来像这样:

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

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

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

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

我是否必须使用Java自反进行编码,还是有一种更简单的方法/工具来做到这一点?

编辑:我也很愿意使用一种简单的方法来更新Ebean实体的多个属性。我找不到myEbeanObject.set("attributeName",value)形式的简单“集合”?

2 个答案:

答案 0 :(得分:1)

如果有人感兴趣,这就是我最后要做的。小型实用程序方法,使用java反射从同一类的另一个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();
    }
}

仅当新值不为null时更新字段。可以按照以下说明从Json更新ebean对象:

SomeClass someObjectToUpdate = fetchMyObjectFromDb();
SomeClass objectToUse  = Json.fromJson(someJsonNode, SomeClass.class);
updateObjFromObj(someObjectToUpdate, objectToUse);
someObjectToUpdate.save();

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

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

PropertyAccessor objToUpdateAccessor = PropertyAccessorFactory.forBeanPropertyAccess(objToUpdate);

然后代替:

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

使用:

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

答案 1 :(得分:0)

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

因此,您可以简单地调用save()方法。

如果您将ebean与Play Framework结合使用,还可以通过update() method更新模型。