Первоначально опубликовано на renanfranca.github.io

После того, как я запустил JHipster генератор впервые я понял, что серверная часть, реализованная с помощью весенней загрузки, не использует Ломбок. Поэтому я решил настроить сгенерированный код для использования ломбока, после чего понял, что это не лучший способ использовать JHipster.


Настроить JHipster

Когда Я понял, насколько классным был JHipster Я подумал, что мне следует изменить сгенерированный код, чтобы он был похож на тот, который я вводил вручную. Поэтому я увидел возможность создать свой собственный план со следующими пользовательскими аннотациями:

  • Добавить Ломбок — @lombok
  • Скрыть комментарий — @noCodeComment
  • Изменить схему базы данных — @schema
  • Добавлять Идентификатор сгенерированного значения к объекту — @generatedValue (идентификация)
  • Определить имя базы данных столбцов — @column(ds_field)
  • Используйте неподдерживаемые типы — @newFieldTypeImport(import_class_package_type) и @newFieldType(type)

Я открыл исходный код своего плана, который настраивает код на стороне сервера:

Вот пример файла jdl, в котором используется мой план:

@lombok  
@schema(MyProject)  
@noCodeComment 
entity RenanClasse (RenanOk) {  
@generatedValue(identity)  
id Long  
@column(ds_name)  
name String
@newFieldTypeImport(java_time_LocalDateTime)  
@newFieldType(LocalDateTime)  
birthday ZonedDateTime
}  

// Use Data Transfer Objects (DTO)  
dto * with mapstruct  

// Service layer  
service all with serviceClass  
Войти в полноэкранный режим

Выйти из полноэкранного режима


JHipster решил не использовать Ломбок

я нашел проблема в сгенерированном jhipster проекте в котором перечислены причины не использовать ломбок. Я процитирую некоторые из них:

  1. В одном проекте новая версия плагина Lombok вызвала сбой IDE (думаю, это был Intellij). Так никто больше не мог работать.

  2. В другом проекте Lombok вызвал сбой сервера CI (и, вероятно, вызвал бы сбой рабочего сервера), так как это вызвало ошибку в JVM.

  3. В третьем проекте мы добились увеличения производительности на 30%, перекодировав equals/hashcode из Lombok.

  4. Затем, для JHipster, история также заключается в том, что мы не можем попросить людей установить плагин в их IDE:

    • 1-я цель — обеспечить бесперебойную работу: вы создаете приложение, и оно работает в вашей среде IDE по умолчанию.

    • 2-я цель заключается в том, что вы можете использовать любую IDE, какую захотите. А у некоторых людей очень экзотические вещи, например я только что попробовал -> нет плагина для этого, конечно


Реализация сущности

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

@Entity
@Table(name = "nap")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Nap implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    @Column(name = "id")
    private Long id;

    @Column(name = "start")
    private ZonedDateTime start;

    @Column(name = "jhi_end")
    private ZonedDateTime end;

    @Enumerated(EnumType.STRING)
    @Column(name = "place")
    private Place place;

    @ManyToOne
    private BabyProfile babyProfile;

    @ManyToOne
    private Humor humor;

    // jhipster-needle-entity-add-field - JHipster will add fields here

    public Long getId() {
        return this.id;
    }

    public Nap id(Long id) {
        this.setId(id);
        return this;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public ZonedDateTime getStart() {
        return this.start;
    }

    public Nap start(ZonedDateTime start) {
        this.setStart(start);
        return this;
    }

    public void setStart(ZonedDateTime start) {
        this.start = start;
    }

    public ZonedDateTime getEnd() {
        return this.end;
    }

    public Nap end(ZonedDateTime end) {
        this.setEnd(end);
        return this;
    }

    public void setEnd(ZonedDateTime end) {
        this.end = end;
    }

    public Place getPlace() {
        return this.place;
    }

    public Nap place(Place place) {
        this.setPlace(place);
        return this;
    }

    public void setPlace(Place place) {
        this.place = place;
    }

    public BabyProfile getBabyProfile() {
        return this.babyProfile;
    }

    public void setBabyProfile(BabyProfile babyProfile) {
        this.babyProfile = babyProfile;
    }

    public Nap babyProfile(BabyProfile babyProfile) {
        this.setBabyProfile(babyProfile);
        return this;
    }

    public Humor getHumor() {
        return this.humor;
    }

    public void setHumor(Humor humor) {
        this.humor = humor;
    }

    public Nap humor(Humor humor) {
        this.setHumor(humor);
        return this;
    }

    // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof Nap)) {
            return false;
        }
        return id != null && id.equals(((Nap) o).id);
    }

    @Override
    public int hashCode() {
        // see 
        return getClass().hashCode();
    }

    // prettier-ignore
    @Override
    public String toString() {
        return "Nap{" +
            "id=" + getId() +
            ", start="" + getStart() + """ +
            ", end='" + getEnd() + "'" +
            ", place="" + getPlace() + """ +
            "}";
    }
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

источник: Nap.java

Таким образом, вы можете создать этот объект, как если бы вы использовали шаблон построителя, но он не является неизменным.

Nap nap = new Nap().id(1l).start(ZonedDateTime.now()).end(ZonedDateTime.now().plusHours(1));
Войти в полноэкранный режим

Выйти из полноэкранного режима

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


Это способ

Я отказался от настройки сгенерированного JHipster кода.
Я понял, что должен принять шаблон кода, сгенерированный jhipster, потому что если я попытаюсь настроить все, я создам свой собственный JHipster, и я потеряю производительность, которую JHipster может привнести в мой рабочий процесс.
Поддерживать план в актуальном состоянии с помощью последней версии генератора jhipster — нетривиальная задача. Поэтому я советую вам создавать план только в том случае, если это крайне необходимо.