如何从Json对象更新Java(Ebean)对象
我已经知道如何使用以下代码从Json创建对象:如何从Json对象更新Java(Ebean)对象,java,json,deserialization,ebean,Java,Json,Deserialization,Ebean,我已经知道如何使用以下代码从Json创建对象: SomeClass someObject = Json.fromJson(someJsonNode, SomeClass.class); 我还知道如何保存和更新ebean对象 我想做的是从JsonNode中的数据更新现有对象,如下所示: SomeClass someObject = fetchMyObjectFromDb(); someObject.updateFromJson(someJsonNode); 或 在我的具体例子中,对象是一个E
SomeClass someObject = Json.fromJson(someJsonNode, SomeClass.class);
我还知道如何保存和更新ebean对象
我想做的是从JsonNode中的数据更新现有对象,如下所示:
SomeClass someObject = fetchMyObjectFromDb();
someObject.updateFromJson(someJsonNode);
或
在我的具体例子中,对象是一个Ebean实体,这可能会有所帮助,但我没有从Ebean中找到任何helper方法
我的Json.*工具与Google Gson非常相似,但我也找不到我想要的东西
我是否必须自己使用Java反射编写代码,或者是否有更简单的方法/工具来实现这一点
编辑:我也很乐意用一种简单的方法来更新一个Ebean实体的多个属性。我找不到myEbeanObject.setattributeName,value形式的简单集合?我想您的SomeClass扩展了ebean的模型,对吗?模型已保存。如果对从数据库中获取的对象调用save,它将被更新;如果对新对象调用save,它将被保存到数据库中
因此,您可以简单地调用save方法
如果您将ebean与Play框架一起使用,您还可以通过更新来更新您的模型。如果有人感兴趣,下面是我最后要做的。小型实用程序方法,使用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();
}
}
编辑/更新:如果您使用它来更新ebean对象,您需要使用setter和getter将更改持久化到DB中
因此,您可以将其添加到字段循环之前:
PropertyAccessor objToUpdateAccessor = PropertyAccessorFactory.forBeanPropertyAccess(objToUpdate);
而不是:
field.set(objToUpdate, field.get(objToUse));
使用:
我将编辑我的问题以使其更清晰。我知道如何保存和更新对象,我想要的是使用来自Json对象或同一类java对象的直接数据来更新它。
PropertyAccessor objToUpdateAccessor = PropertyAccessorFactory.forBeanPropertyAccess(objToUpdate);
field.set(objToUpdate, field.get(objToUse));
objToUpdateAccessor.setPropertyValue(field.getName(), field.get(objToUse));