首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在RESTful API中合并两个java bean的最好方法是什么?

在RESTful API中合并两个java bean的最好方法是什么?
EN

Stack Overflow用户
提问于 2015-03-31 23:51:02
回答 2查看 1.2K关注 0票数 0

场景很简单: UI调用RESTful接口来获取对象树,然后UI更改一些数据并调用RESTful接口来更新它。

但是出于安全或性能的原因,我的RESTful应用程序接口不能将整个对象树带到UI中。

为此,我们有两个选择:为JsonIgnore API创建一个单独的Java Bean,或者扩展现有的业务Java Bean加上@ RESTful。

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

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

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

我要求通用的方法,以避免硬代码复制字段。

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

所以我是这样想的:

如果UI bean中的字段不为Null,则覆盖目标bean中相同名称字段的值。但是如果字段是某种原始类型,比如int,它的默认值是0,我该如何处理呢?我不知道字段是否真的带有UI值0,或者只是不是从UI返回的。

我尝试过将原始类型转换为对象类型,但是在布尔类型上仍然存在问题,很多java工具都不支持“boolean isValid(){…}“就像BeanUtils一样。这种类型的转换在现有代码上是危险的。

我尝试过这些代码:

代码语言:javascript
复制
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始终为空。我使用的是Jackson 1.9.2

EN

回答 2

Stack Overflow用户

发布于 2015-04-08 03:04:44

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

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

票数 0
EN

Stack Overflow用户

发布于 2016-03-26 04:03:56

我在杰克逊身上找到了解决方案:

代码语言:javascript
复制
MyBean defaults = objectMapper.readValue(defaultJson, MyBean.class);
ObjectReader updater = objectMapper.readerForUpdating(defaults);
MyBean merged = updater.readValue(overridesJson);

它来自于:

readerForUpdating

merging on Jackson

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29372917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档