Скопируйте свойства в Builder с помощью BeanUtils.copyProperties, предоставленного Spring.

Я пытаюсь скопировать свойства объекта POJO в Builder другого неизменяемого объекта, например:

public class CopyTest {

    // the source object
    public static class Pojo1 {
        private int value;

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }
    }

    // the target object
    public static class Pojo2 {
        private final int value;

        public Pojo2(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }

        public static Pojo2Builder builder() {
            return new Pojo2Builder();
        }

        // builder of the target object, maybe generated by lombok
        public static class Pojo2Builder {
            private int value;

            private Pojo2Builder() {}

            public Pojo2Builder value(int value) {
                this.value = value;
                return this;
            }

            public Pojo2 build() {
                return new Pojo2(value);
            }
        }
    }

    public static void main(String[] args) {

        Pojo1 src = new Pojo1();
        src.setValue(1);

        Pojo2.Pojo2Builder builder = Pojo2.builder();

        // this won't work, provided by spring-beans
        BeanUtils.copyProperties(src, builder);

        Pojo2 target = builder.build();
    }

}

Проблема в том, что BeanUtils.copyProperties(), предоставленный spring-beans, не будет вызывать Pojo2Builder.value(int), потому что это не setter;

Кроме того, класс Builder обычно генерируется lombok, поэтому я не могу назвать метод Pojo2Builder.value(int) как Pojo2Builder.setValue(int).

Кстати, я уже сделал это, используя BeanUtilsBean.copyProperties() в commons-beanutils, предоставленном apache commons, зарегистрировав настроенный BeanIntrospector, но я обнаружил, что копирование свойств с использованием commons-beanutils намного дороже, чем с использованием spring-beans, когда копирование происходит между двумя разными классы, поэтому я предпочитаю делать это с помощью spring-beans

Итак, возможно ли скопировать свойства в класс Builder с помощью Spring или других утилит, которые более эффективны, чем commons-beanutils?


person Juan Zhong    schedule 20.06.2017    source источник


Ответы (2)


Вам нужно будет не только изменить имя метода, но и изменить его возвращаемый тип на void (довольно глупо для билдера). Добавление аннотации @Setter помогло бы, если это разрешено.

Если вам нужно скопировать значения в билдер того же класса, вы можете использовать Lombok toBuilder(). Или создайте объект напрямую, используя @Wither.

Если вам нужно придерживаться соглашений о бобах, то вам, вероятно, не повезло. рассмотрите возможность использования mapstruct, которая должна быть более гибкой.

person maaartinus    schedule 20.06.2017

Если компоновщик не следует соглашениям о bean-компонентах, он не будет работать с утилитами bean-компонентов.

Либо меняйте билдер, либо пишите свою утилиту копирования.

person OrangeDog    schedule 20.06.2017