Вот один из подходов, который я нашел после поиска в Интернете.Вы можете использовать BeanUtils
.Вот maven-зависимость для него (не забудьте проверить обновленную версию, когда вы ее используете).
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
Теперь вам нужно создать другой класс (className может быть любым) следующим образом:
public class NullAwareBeanArrayUtilsBean extends BeanUtilsBean {
@Override
public void copyProperty(Object dest, String name, Object value) throws IllegalAccessException, InvocationTargetException {
if (value == null || (value instanceof List<?> && ((List<?>) value).size() <= 0))
return;
super.copyProperty(dest, name, value);
}
}
И если вы хотите использовать его где-либо еще в вашем коде, используйте его следующим образом:
BeanUtilsBean notNull = new NullAwareBeanArrayUtilsBean();
notNull.copyProperties(dest, original);
Пояснение
BeanUtils
являетсябиблиотека, которая имеет один метод для копирования свойств из одного pojo в другое pojo.У него есть метод copyProperties
, который внутренне вызывает метод copyProperty
.Здесь мы создали подкласс с именем NullAwareBeanArrayUtilsBean
, который расширяет BeanUtilsBean
, и мы предоставили пользовательскую функциональность одному из его методов с именем copyProperty
.
Помните, что этот метод вызывается внутренне из метода copyProperties
,Вы можете попробовать консольное протоколирование name
в этом методе copyProperty
, чтобы увидеть, что name
ссылается на поле each
из вашего pojo.
Что мы делаем в пользовательском переопределенном методе copyProperty?
Рассмотрим эту строку
BeanUtilsBean notNull = new NullAwareBeanArrayUtilsBean();
notNull.copyProperties(dest, original);
Здесь мы говорим, что хотим скопироватьвещи от original
pojo до dest
pojo.
Для каждого поля в нашем pojo, copyProperties
внутренне вызывает наш пользовательский переопределенный метод с именем copyProperty
.
Рассмотрим первую строку copyProperty
метода:
if (value == null || (value instanceof List<?> && ((List<?>) value).size() <= 0)) return;
Здесь мы проверяем, value is null
или if value is a List
и является ли это list empty
, тогда мы пропускаем операцию копирования.Следовательно, при таком подходе, если пользователь отправляет частичный объект из почтальона (например), мы будем копировать только те поля, в которые пользователь все время помещал некоторые вещи, не меняя другие поля (которые уже имеют старое содержимое) в нашем pojo назначения..