在restfulapi中合并两个javabean的最佳方法是什么?

在restfulapi中合并两个javabean的最佳方法是什么?,java,rest,merge,jackson,javabeans,Java,Rest,Merge,Jackson,Javabeans,情况很简单: UI调用RESTful API来获取对象树,然后UI更改一些数据并调用RESTful API来更新它 但出于安全或性能原因,我的RESTful API无法将整个对象树带到UI 为此,我们有两种选择:为restfulapi创建单个javabean或扩展现有业务javabean plus@JsonIgnore 第二个看起来更聪明,因为我们重复使用商务舱 但现在我们遇到了一个问题:我需要将UI中的对象与DB中的对象合并,否则会丢失一些数据 但我如何知道哪一段数据将来自UI? 我知道我可以

情况很简单: UI调用RESTful API来获取对象树,然后UI更改一些数据并调用RESTful API来更新它

但出于安全或性能原因,我的RESTful API无法将整个对象树带到UI

为此,我们有两种选择:为restfulapi创建单个javabean或扩展现有业务javabean plus@JsonIgnore

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

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

但我如何知道哪一段数据将来自UI? 我知道我可以通过硬编码一个接一个地复制字段。 但这种方式是危险的

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

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

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

我尝试将基本类型转换为对象类型,但在布尔类型上仍然存在问题,许多java工具不支持BeanUtils之类的“boolean isValid(){…}”。这种转换对现有代码是危险的

我试过这些代码:

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.92

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


下面是一个实现:

我在Jackson上找到了解决方案:

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


你能用反射来做吗?比如读取ui bean中的所有字段并将它们传输到数据库bean?你能给我一个简单的例子吗?对Ria来说:我知道如何以一种通用的方式合并JavaBean,但我需要知道哪些字段来自UI。现在我明白了。只是一些头脑风暴:向传输的对象添加一个列表,其中保存用户更改的字段名?