Ana içeriğe geç

Lombok Plugin#

Lombok plugin kullanılarak projede kolaylıkla lombok kullanımına başlanabilir. Mapstruct'ın oluşturduğu dosyalar ile entegre çalışabilmektedir. Böylece lombok kullanılan entity ve modeller mapstruct'ı engellemeyecektir.

Kullanım#

Projelere iki farklı yöntem ile eklenebilmektedir. Yöntemler şunlardır:

DSL kullanımı

build.gradle
plugins {
    id 'hvl-lombok-plugin' version hvlLombokPluginVersion
}

Buildscript kullanımı

build.gradle
buildscript {
    repositories {
        maven {
            url 'http://nexus.bulut.ai/repository/framework-plugin-group/'
        }
    }
    dependencies {
        classpath(group: 'tr.com.havelsan.plugin', name: 'hvl-gradle-lombok-plugin', version: hvlLombokPluginVersion)
    }
}

apply plugin: 'hvl-lombok-plugin'


Konfigurasyon Yapısı#

build.gradle dosyası içerisindeki extensionda aşağıdaki gibi ayarlama yapılmalıdır.

build.gradle
// optional
hvlLombok {
  library = 'org.projectlombok:lombok:1.18.30'
}
// optional
  • library: Varsayılan olarak güncel lombok kütüphanesi sağlanmaktadır ancak sağlanan versiyondan farklı bir versiyon kullanılmak istendiği durumlarda bu değişken kullanılabilir.

Kod build edildiğinde lombok otomatik olarak çalışarak class dosyalarını oluşturmaktadır. Buna ek olarak plugin ile birlikte delombok gibi bazı lombok taskları da kullanıma açılmaktadır.

Bu tasklar proje içinde IDE üzerinden veya konsol ile kullanılabilir.

Konsol Kullanımı

Lombok anotasyonlarına sahip sınıfların java dosyalarını oluşturmak için kullanılır. Sınıflar varsayılan olarak build/generated/delombok altına oluşturulur.

Kullanım şekli: gradle delombok

Ide üzerinden kullanım

Örnek Lombok Kullanımı#

HvlJpaSample.java
package tr.com.havelsan.javarch.samples.jpa.data.entity;

import lombok.Data;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import tr.com.havelsan.javarch.data.jpa.crypto.converter.HvlStringCryptoConverter;
import tr.com.havelsan.javarch.domain.model.entity.HvlLocalizedEntity;
import tr.com.havelsan.javarch.domain.model.entity.HvlLocalizedId;
import tr.com.havelsan.javarch.domain.model.entity.HvlSoftDeleteEntity;
import tr.com.havelsan.javarch.samples.jpa.data.constraint.HvlJpaSampleConstraint;

import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.Map;

/**
 * @author javarch
 */
@Entity
@Table(name = HvlJpaSample.TABLE_NAME)
@Data
public class HvlJpaSample extends HvlSoftDeleteEntity {

    //Table Name
    public static final String TABLE_NAME = "SAMPLE1";

    //Columns
    public static final String NAME_COLUMN = "NAME";
    public static final String SURNAME_COLUMN = "SURNAME";
    public static final String DESCRIPTION_COLUMN = "DESCRIPTION";

    //Foreign Keys
    protected static final String SAMPLE1_DETAIL_MAPPED_BY = "sample1";
    protected static final String SAMPLE1_DETAIL_MAPPED_KEY =
            HvlLocalizedEntity.LOCALIZED_ID_FIELD + "." + HvlLocalizedId.LOCALE_FIELD;

    @Column(name = NAME_COLUMN)
    @NotBlank
    @Size(max = HvlJpaSampleConstraint.NAME_SIZE)
    private String name;

    @Column(name = SURNAME_COLUMN)
    @NotBlank
    @Size(max = HvlJpaSampleConstraint.SURNAME_SIZE)
    @Convert(converter = HvlStringCryptoConverter.class)
    private String surname;

    @OneToMany(mappedBy = SAMPLE1_DETAIL_MAPPED_BY, cascade = {CascadeType.ALL}, orphanRemoval = true)
    @MapKey(name = SAMPLE1_DETAIL_MAPPED_KEY)
    @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
    private Map<String, HvlJpaSampleDetail> detailMap;

}

Lombok'un @Data anotasyonu kullanımı sonucunda aşağıdaki gibi bir class dosyası oluşmaktadır.

HvlJpaSample.class
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package tr.com.havelsan.javarch.samples.jpa.data.entity;

import java.util.Map;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.MapKey;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import tr.com.havelsan.javarch.data.jpa.crypto.converter.HvlStringCryptoConverter;
import tr.com.havelsan.javarch.domain.model.entity.HvlSoftDeleteEntity;

@Entity
@Table(
        name = "SAMPLE1"
)
public class HvlJpaSample extends HvlSoftDeleteEntity {
    public static final String TABLE_NAME = "SAMPLE1";
    public static final String NAME_COLUMN = "NAME";
    public static final String SURNAME_COLUMN = "SURNAME";
    public static final String DESCRIPTION_COLUMN = "DESCRIPTION";
    protected static final String SAMPLE1_DETAIL_MAPPED_BY = "sample1";
    protected static final String SAMPLE1_DETAIL_MAPPED_KEY = "localizedId.locale";
    @Column(
            name = "NAME"
    )
    private @NotBlank
    @Size(
            max = 50
    ) String name;
    @Column(
            name = "SURNAME"
    )
    @Convert(
            converter = HvlStringCryptoConverter.class
    )
    private @NotBlank
    @Size(
            max = 50
    ) String surname;
    @OneToMany(
            mappedBy = "sample1",
            cascade = {CascadeType.ALL},
            orphanRemoval = true
    )
    @MapKey(
            name = "localizedId.locale"
    )
    @Cache(
            usage = CacheConcurrencyStrategy.TRANSACTIONAL
    )
    private Map<String, HvlJpaSampleDetail> detailMap;

    public HvlJpaSample() {
    }

    public String getName() {
        return this.name;
    }

    public String getSurname() {
        return this.surname;
    }

    public Map<String, HvlJpaSampleDetail> getDetailMap() {
        return this.detailMap;
    }

    public void setName(final String name) {
        this.name = name;
    }

    public void setSurname(final String surname) {
        this.surname = surname;
    }

    public void setDetailMap(final Map<String, HvlJpaSampleDetail> detailMap) {
        this.detailMap = detailMap;
    }

    public boolean equals(final Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof HvlJpaSample)) {
            return false;
        } else {
            HvlJpaSample other = (HvlJpaSample) o;
            if (!other.canEqual(this)) {
                return false;
            } else {
                label47:
                {
                    Object this$name = this.getName();
                    Object other$name = other.getName();
                    if (this$name == null) {
                        if (other$name == null) {
                            break label47;
                        }
                    } else if (this$name.equals(other$name)) {
                        break label47;
                    }

                    return false;
                }

                Object this$surname = this.getSurname();
                Object other$surname = other.getSurname();
                if (this$surname == null) {
                    if (other$surname != null) {
                        return false;
                    }
                } else if (!this$surname.equals(other$surname)) {
                    return false;
                }

                Object this$detailMap = this.getDetailMap();
                Object other$detailMap = other.getDetailMap();
                if (this$detailMap == null) {
                    if (other$detailMap != null) {
                        return false;
                    }
                } else if (!this$detailMap.equals(other$detailMap)) {
                    return false;
                }

                return true;
            }
        }
    }

    protected boolean canEqual(final Object other) {
        return other instanceof HvlJpaSample;
    }

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $name = this.getName();
        result = result * 59 + ($name == null ? 43 : $name.hashCode());
        Object $surname = this.getSurname();
        result = result * 59 + ($surname == null ? 43 : $surname.hashCode());
        Object $detailMap = this.getDetailMap();
        result = result * 59 + ($detailMap == null ? 43 : $detailMap.hashCode());
        return result;
    }

    public String toString() {
        String var10000 = this.getName();
        return "HvlJpaSample(name=" + var10000 + ", surname=" + this.getSurname() + ", detailMap=" + this.getDetailMap() + ")";
    }
}

Lombok'un tüm özelliklerine erişmek için linkler