Генерация кода картографа

Для pojo и DTO доступно множество инструментов сопоставления. Проверьте ссылку: любой инструмент для сопоставления объектов Java с объектами? Но есть ли какой-нибудь инструмент, автоматически генерирующий классы DAO, Service?

Образец бульдозера:

<mapping>
  <class-a>yourpackage.SourceClassName</class-a>
  <class-b>yourpackage.DestinationClassName</class-b>
    <field>
      <A>yourSourceFieldName</A>
      <B>yourDestinationFieldName</B>
    </field>
</mapping>

SourceClassName sourceObject = ...
Mapper mapper = new DozerBeanMapper();
DestinationObject destObject =
    mapper.map(sourceObject, DestinationClassName.class);
assertTrue(destObject.getYourDestinationFieldName().equals(sourceObject.getYourSourceFieldName));

Здесь конфигурация xml в порядке, но могу ли я пропустить часть кода и просто указать конфигурацию POJO-DTO или POJO-DTO вместе с конфигурацией фильтра. И какой-то инструмент должен уметь автоматически генерировать промежуточный код перевода в виде классов DAO и Service. Есть ли такие инструменты?


person Pankaj Pandit    schedule 28.07.2016    source источник


Ответы (1)


Мое опоздание, недавно я разработал процессор аннотаций под названием beanknife, он поддерживает создание DTO из любого класса. Вам нужен конфиг по аннотации. Но вам не нужно менять исходный класс. Эта библиотека поддерживает настройку отдельного класса. Конечно, вы можете выбрать, какая недвижимость вам нужна, а какая вам не нужна. И вы можете добавить новое свойство статическим методом в классе конфигурации. Наиболее мощной функцией этой библиотеки является поддержка автоматического преобразования свойства объекта в версию DTO. Например

class Pojo1 {
    String a;
    Pojo b;
}

class Pojo2 {
    Pojo1 a;
    List<Pojo1> b;
    Map<List<Pojo1>>[] c;
}

@ViewOf(value = Pojo1.class, includePattern = ".*", excludes={Pojo1Meta.b})
class ConfigureOfPojo2 {}

@ViewOf(value = Pojo2.class, includePattern = ".*")
class ConfigureOfPojo2 {
    // convert b to dto version
    @OverrideViewProperty(Pojo2Meta.b)
    private List<Pojo1View> b;
    // convert c to dto version
    @OverrideViewProperty(Pojo2Meta.c)
    private Map<List<Pojo1View>>[] c;
}

будет генерировать

// meta class, you can use it to reference the property name in a safe way.
class Pojo1Meta {
    public final String a = "a";
    public final String b = "b";
}

// generated DTO class. The actual one will be more complicate, there are many other method.
class Pojo1View {
    private String a;
    public Pojo1View read(Pojo1 source) { ... }
    ... getters and setters ...
}

class Pojo2Meta {
    public final String a = "a";
    public final String b = "b";
    public final String c = "c";
}

class Pojo2View {
    private String a;
    private List<Pojo1View> b;
    private Map<List<Pojo1View>>[] c;
    public Pojo1View read(Pojo2 source) { ... }
    ... getters and setters ...
}

Интерес здесь в том, что вы можете безопасно использовать класс, еще не существующий в исходном коде. Хотя компилятор может пожаловаться, после компиляции все будет в порядке. Потому что весь дополнительный класс будет автоматически сгенерирован непосредственно перед компиляцией. Лучшим подходом может быть пошаговая компиляция, сначала добавление аннотаций @ViewOf, а затем компиляция, чтобы были сгенерированы все классы, которые необходимо использовать позже. Скомпилируйте снова после завершения конфигурации. Преимущество этого заключается в том, что в среде IDE не будет подсказок о грамматических ошибках, и она сможет лучше использовать функцию автозаполнения среды IDE.

Чтобы использовать объект DTO в коде, просто вызовите статический метод чтения, подобный этому

Pojo2 source = ...
Pojo2View dto = Pojo2View.read(source);
List<Pojo2> listSource = ...
List<Pojo2View> dtoList = Pojo2View.read(listSource)
Map<String, Pojo2> mapSource = ...
List<Pojo2View> dtoMap = Pojo2View.read(mapSource)

Никакого отражения, никакой магии. Все логическое можно проверить в сгенерированном классе.

person vipcxj    schedule 25.12.2020