То, как я читаю эти требования, заключается в том, что любое свойство в правом (целевом) компоненте должно быть перезаписано, если в левом (исходном) компоненте есть соответствующее ненулевое значение. Так что это немного отличается от PropertyUtils.copyProperties, который переписывает все свойства (включая нулевые исходные значения).
Одной из возможностей было бы использование Jakarta Commons BeanUtils , тогда вы можете использовать
PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(leftBean);
if (descriptors != null) {
for (PropertyDescriptor descriptor : descriptors) {
try {
String propertyName = descriptor.getName();
Object val = PropertyUtils.getProperty(leftBean, name);
if (val != null) {
PropertyUtils.setProperty(rightBean, name, val);
}
} catch (Exception ignore) {
// not interested in what we can't read or write
}
}
}