该场景很简单: 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
你能与反思这样做?像读取你的ui-bean中的所有字段并将它们传送到数据库bean?你能举一个简单的例子吗? – Ria 2015-03-31 17:05:00
到Ria:我知道如何以通用的方式合并java bean,但我需要知道哪些字段来自UI。 – Justin 2015-03-31 17:22:08
好了,现在我明白了。只是一些头脑风暴:添加一个列表到传递的对象,其中包含用户更改的字段名称? – Ria 2015-03-31 17:29:28