Есть ли способ сделать поля карты Dozer без геттеров или сеттеров?(Или какой картограф может это сделать?) - PullRequest
0 голосов
/ 04 декабря 2018

Вот статья о Dozer: https://www.baeldung.com/dozer. Это картограф, который использует отражение для отображения полей с одинаковыми именами из одного объекта в другой (совершенно не связанного класса).

Мне было интересно,это работает гибко с закрытыми полями, получателями и установщиками.То есть

  • Будет ли private String a отображаться на private String a другого объекта без использования геттеров или сеттеров?

  • Что если только одинсторона имеет геттер или сеттер (а приватное поле имеет другое имя, чтобы убедиться, что оно не имеет прямого доступа к приватным полям)?

  • Что если у одного есть геттер, а у другого сеттерза полное несоответствие приватных полей?(Но имена геттеров и сеттеров совпадают.)

Я написал тестовую программу для запуска в https://www.jdoodle.com/online-java-compiler:

import org.dozer.DozerBeanMapper;

public class Main {

    public static class MySource {

        // a -> a
        private String a;

        // getB() -> b
        private String hidden_b;
        public String getB() { return hidden_b; }

        // c -> setC(c)
        private String c;

        // getD() -> setD(d)
        private String hidden_d;

        // proper getters and setters on both sides
        private String proper;
        public String getProper() { return proper; }
        // public void setProper(String proper_) { proper = proper_; }

        public MySource() {
            a = "A Room with a View";
            hidden_b = "The Bridge of San Luis Rey";
            c = "Civilwarland in Bad Decline";
            hidden_d = "Darkness at Noon";
            proper = "This should copy, at minimum.";
        }

        public void print() {
            System.out.println("Source");
            System.out.println("================================");
            System.out.println("a        = " + a);
            System.out.println("hidden_b = " + hidden_b);
            System.out.println("c        = " + c);
            System.out.println("hidden_d = " + hidden_d);
            System.out.println("--------------------------------");
            System.out.println("proper   = " + proper);
            System.out.println("");
        }
    }

    public static class MyTarget {

        private String a;
        private String b;
        private String hidden_c;
        private String hidden_e;

        public void setC(String param) { hidden_c = param; }
        public void setD(String param) { hidden_e = param; }

        private String proper;
        // public String getProper() { return proper; }
        public void setProper(String proper_) { proper = proper_; }

        public MyTarget() {}

        public void print() {
            System.out.println("Target");
            System.out.println("================================");
            System.out.println("a        = " + a);
            System.out.println("b        = " + b);
            System.out.println("hidden_c = " + hidden_c);
            System.out.println("hidden_e = " + hidden_e);
            System.out.println("--------------------------------");
            System.out.println("proper   = " + proper);
            System.out.println("");
        }
    }

    public static void main(String args[]) {
        MySource s = new MySource();
        s.print();

        System.out.println("Now dozing...");
        System.out.println("");

        MyTarget t = new DozerBeanMapper().map(s, MyTarget.class);
        t.print();
    }
}

Обратите внимание, что для запуска приведенного выше кода вынеобходимо добавить зависимость maven:

Group ID:    net.sf.dozer
Artifact ID: dozer
Version:     5.5.1

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

В любом случае, мой вывод был:

Source
================================
a        = A Room with a View
hidden_b = The Bridge of San Luis Rey
c        = Civilwarland in Bad Decline
hidden_d = Darkness at Noon
--------------------------------
proper   = This should copy, at minimum.

Now dozing...

Target
================================
a        = null
b        = null
hidden_c = null
hidden_e = null
--------------------------------
proper   = This should copy, at minimum.

Итак, похоже, что Dozer only работает через геттер на источнике и сеттер на цели, что разочаровывает.Или я не правильно его использую!

Есть ли способ сделать Dozer более гибким?Или другая библиотека картографов, которая может достичь этого?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Dozer по умолчанию использует геттеры и сеттеры, однако вы можете указать Dozer (через отображение) для прямого доступа к полям http://dozer.sourceforge.net/documentation/custommethods.html

Кстати, Dozer 5 и 6 также содержит отображение на основе API.

0 голосов
/ 04 декабря 2018

Хорошо, вот мои выводы.Надеюсь, это кому-нибудь поможет.

Dozer 5.5.1 должен был делать это через "доступный на уровне класса".Однако была ошибка .Это было исправлено в будущих выпусках, например Dozer 6.1+.(Пакет переместился в новую группу, org.github.dozermapper.) Хотя шаги были немного сложнее, и в конце концов я бросил попробовать ModelMapper, что было намного приятнее.Вот мой код.

Включите этот пакет:

Group ID:    org.modelmapper
Artifact ID: modelmapper
Version:     2.3.2

Вот как его использовать:

import org.modelmapper.ModelMapper;
import org.modelmapper.config.Configuration;

public class Main {

    public static class MySource {

        // a -> a
        private String a;

        // getB() -> b
        private String hidden_b;
        public String getB() { return hidden_b; }

        // c -> setC(c)
        private String c;

        // getD() -> setD(d)
        private String hidden_d;

        // proper getters and setters on both sides
        private String proper;
        public String getProper() { return proper; }
        // public void setProper(String proper_) { proper = proper_; }

        public MySource() {
            a = "A Room with a View";
            hidden_b = "The Bridge of San Luis Rey";
            c = "Civilwarland in Bad Decline";
            hidden_d = "Darkness at Noon";
            proper = "This should copy, at minimum.";
        }

        public void print() {
            System.out.println("Source");
            System.out.println("================================");
            System.out.println("a        = " + a);
            System.out.println("hidden_b = " + hidden_b);
            System.out.println("c        = " + c);
            System.out.println("hidden_d = " + hidden_d);
            System.out.println("--------------------------------");
            System.out.println("proper   = " + proper);
            System.out.println("");
        }
    }

    public static class MyTarget {

        private String a;
        private String b;
        private String hidden_c;
        private String hidden_e;

        public void setC(String param) { hidden_c = param; }
        public void setD(String param) { hidden_e = param; }

        private String proper;
        // public String getProper() { return proper; }
        public void setProper(String proper_) { proper = proper_; }

        public MyTarget() {}

        public void print() {
            System.out.println("Target");
            System.out.println("================================");
            System.out.println("a        = " + a);
            System.out.println("b        = " + b);
            System.out.println("hidden_c = " + hidden_c);
            System.out.println("hidden_e = " + hidden_e);
            System.out.println("--------------------------------");
            System.out.println("proper   = " + proper);
            System.out.println("");
        }
    }

    public static void main(String args[]) {

        ModelMapper modelMapper = new ModelMapper();
        modelMapper.getConfiguration()
            .setFieldMatchingEnabled(true)
            .setFieldAccessLevel(Configuration.AccessLevel.PRIVATE);

        MySource s = new MySource();
        s.print();

        System.out.println("Now dozing...");
        System.out.println("");

        MyTarget t = modelMapper.map(s, MyTarget.class);
        t.print();
    }
}

Вот мой вывод:

Source
================================
a        = A Room with a View
hidden_b = The Bridge of San Luis Rey
c        = Civilwarland in Bad Decline
hidden_d = Darkness at Noon
--------------------------------
proper   = This should copy, at minimum.

Now dozing...

Target
================================
a        = A Room with a View
b        = The Bridge of San Luis Rey
hidden_c = Civilwarland in Bad Decline
hidden_e = null
--------------------------------
proper   = This should copy, at minimum.

Четвертый случай не копировался, но меня это не волнует.Я думаю, что это может быть легко достигнуто с другой конфигурацией ModelMapper, хотя.Может быть, попробуйте LOOSE копирование.Или в худшем случае, вручную свяжите методы получения и установки в конфигурации.

...