Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-如何简化我的Java_Java_Pojo_Apache Commons Beanutils - Fatal编程技术网

Java-如何简化我的Java

Java-如何简化我的Java,java,pojo,apache-commons-beanutils,Java,Pojo,Apache Commons Beanutils,我正在Spring框架中编写一些java代码 我有两个豆子,一个人和一个人。它们的结构稍有不同,也就是说每个变量的变量名稍有不同 我试图将细节从一个bean复制到另一个bean。我只想在值不为null时复制该值。我见过一个名为BeanUtils的API,但不管它是否为null,它都会复制它 这是我的密码: if (person != null) { if (person.getAddressDetails() != null) { if (person

我正在Spring框架中编写一些java代码

我有两个豆子,一个人和一个人。它们的结构稍有不同,也就是说每个变量的变量名稍有不同

我试图将细节从一个bean复制到另一个bean。我只想在值不为null时复制该值。我见过一个名为BeanUtils的API,但不管它是否为null,它都会复制它

这是我的密码:

if (person != null) {
       if (person.getAddressDetails() != null) {
               if (person.getAddressDetails().getStreetNumber() != null) {
                       person1.getAddressDetails().setStreetNo(person.getAddressDetails().getStreetNumber());
               }

               if (person.getAddressDetails().getStreetName() != null) {
                       person1.getAddressDetails().setStreetName(person.getAddressDetails().getStreetName());
               }
       }

       if (person.getHomeDetails() != null) {
               if (person.getHomeDetails().getPhoneNumber() != null) {
                       person1.getHomeDetails().setSPhoneNo(person.getHomeDetails().getPhoneNumber());
               }
       }
}
我有大约40个节点需要被复制,这会产生太多难看的代码。有人有更好的方法吗?也许如果我做一个映射什么的然后循环通过它?不确定

如果没有,有人知道我是否可以让BeanUtils在不复制空值的情况下运行副本吗

原因是第二个bean person1已经有了一堆值。我只想在有新值要覆盖时覆盖它

像往常一样,这些变量是一个更大系统的一部分,我不能标准化它们的名称


感谢

从另一个方向解决问题,源数据对象不应该关心目标对象的约束或业务逻辑需求

这将是紧密耦合,这是不好的,特别是如果您使用Spring,您所做的正是像Spring这样的IoC容器试图帮助您而不是所做的

在目标对象的
setXXX()
方法中放入
null检查
编码,如果源属性为
null
,则这是处理业务规则的正确位置

public setXXX(final String s)
{
  if (s == null) { // do nothing }
  else { this.xxx = s; }
}

然后,您可以使用您想要的任何映射策略/库,而不必担心源数据
null
状态。盲目地设置属性,让目标决定何时忽略传入的
null

我想知道是否可以帮助您。

如果所有值都是由标准的getter/setter方法定义的,您可以使用反射来查找字段,并且仅在字段不为null时执行复制。但是,你会用if/else块来交换try/catch块和反射代码。我不熟悉反射,你能解释一下吗?你没有明确地说,但是我假设person和person1是同一类的实例,对吗?他们明确地说,
person
person1
不是同一类的实例。“它们的结构略有不同,也就是说每个变量的变量名略有不同。”+1用于寻找替代解决方案,而不是编写一堆样板代码,这将是一场噩梦。a)如果有覆盖非空属性的通用业务规则,这对于一个复杂的系统来说可能很难推广;(b)如果你试图合并()的话,将特定的逻辑添加到ORM持久化的对象中最终会让你的生活陷入地狱。他们没有说任何关于ORM或任何这些问题的内容。我坚持我的答案,类应该决定它的
nullablity
不是什么,外部实体,即紧耦合和中断封装引入了低内聚并使调试成为一场噩梦。OOA的最佳实践是松散耦合和高内聚,具有可怕的类名,如
person
person1
,我认为OP并不是真正关心理论上的企业关注点,他们只是想用最少的代码将属性数据从一个类映射到另一个类。
public setXXX(final String s)
{
  if (s == null) { // do nothing }
  else { this.xxx = s; }
}