2015-03-31 67 views
0

该场景很简单: UI调用RESTful API来获取对象树,然后UI更改一些数据并调用RESTful API来更新它。在RESTful API中合并两个Java bean的最佳方式是什么?

但是出于安全或性能方面的原因...,我的RESTful API无法将整个对象树引入UI。

我们有两种选择:为RESTful API创建单独的Java Bean,或者扩展现有的商业Java Bean和@JsonIgnore。

第二个看起来更聪明,因为我们重新使用商务舱。

但现在我们遇到了麻烦:我需要将UI中的对象与DB中的对象合并,否则我会丢失一些数据。

但是我怎么知道哪一段数据会来自UI? 我知道我可以硬编码一个一个地复制字段。 但这种方式很危险。

我在寻求通用的方法来避免硬代码复制字段。

我尝试了org.apache.commons.beanutils.BeanUtils,但它不能满足要求,因为它总是覆盖目标字段。

所以我这样想:
如果UI bean中的字段不是Null,那么覆盖目标bean中同名字段的值。但如果字段是某种像int这样的默认值为0的基本类型,我该如何处理? 我不知道该字段是否真的带有UI值0,或者不是从UI返回。

我试图将原始类型转换为对象类型,但它仍然有布尔类型的问题,许多java工具不支持“Boolean isValid(){...}”像BeanUtils。这种转换在现有的代码中是危险的。

我想这些代码:

JacksonAnnotationIntrospector ai = new JacksonAnnotationIntrospector(); 
AnnotatedClass ac = AnnotatedClass.construct(MyClassDTO.class, ai, null); 
    String[] ignoredList = ai.findPropertiesToIgnore(ac);  
    for(String one: ignoredList){ 
     System.out.println(one); 
    } 

但ignoredList总是空。我正在使用杰克逊1.9.2

+0

你能与反思这样做?像读取你的ui-bean中的所有字段并将它们传送到数据库bean?你能举一个简单的例子吗? – Ria 2015-03-31 17:05:00

+0

到Ria:我知道如何以通用的方式合并java bean,但我需要知道哪些字段来自UI。 – Justin 2015-03-31 17:22:08

+0

好了,现在我明白了。只是一些头脑风暴:添加一个列表到传递的对象,其中包含用户更改的字段名称? – Ria 2015-03-31 17:29:28

回答

0

你可以考虑使用JsonPatch。我们使用它,它工作得很好。当然,这意味着你在JSON级别上应用补丁,而不是直接在bean上应用补丁,所以如果你需要支持的不仅仅是JSON,它可能是一个问题。

下面是一个实现:https://github.com/fge/json-patch

0

我发现了杰克逊的解决方案:

MyBean defaults = objectMapper.readValue(defaultJson, MyBean.class); 
ObjectReader updater = objectMapper.readerForUpdating(defaults); 
MyBean merged = updater.readValue(overridesJson); 

它来自:

readerForUpdating

merging on Jackson

相关问题