What is Lombok?
- Lombok is a Java library that can automatically plug into your editor and build tools when defining Java classes. 
- If you write Lombok annotations (e.g. @Getter or @setter), you don’t need to write another Getter or Setter methods again. 
- With one annotation, your class has a fully featured builder. 
IDE
In this tutorial, we will use Eclipse.
Source Code
You can refer to the source code below.
https://github.com/ZarLiHninn/Form-Submitting-Lombok-WebJars
Let’s start Lombok
We will show you how to use Lombok in our previous project which is Form Submitting with Spring Boot Validation.
Step 1. Download and Install
- Please download lombok.jar from https://projectlombok.org/download
  
- Open downloaded lombok.jar.
- Specify your Eclipse IDE location by clicking Specify location and then you can see your Eclipse location.
- Click Install/Update.
  
- And now, your installation is completed and restart Eclipse.
  
Step 2. Add Lombok dependency in pom.xml
<dependency>  
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>  
Step 3. Add Lombok annotation in Student.class
This is the code before using lombok.
↓
package com.reytech.demo.model;
import java.time.LocalDate;
import java.util.List;
import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Positive;
import javax.validation.constraints.Size;
import org.springframework.format.annotation.DateTimeFormat;
public class Student {
    @NotEmpty(message = "{validation.name.NotEmpty}")
    @Size(min = 2, max = 50, message = "{validation.name.Size}")
    private String name;
    @NotNull(message = "{validation.age.NotNull}")
    @Positive(message = "{validation.age.Positive}")
    @Max(value = 18, message = "{validation.age.Maximum}")
    private Integer age;
    @NotEmpty(message = "{validation.email.NotEmpty}")
    @Email(message = "{validation.email.Type}")
    private String email;
    @NotEmpty(message = "{validation.subjects.NotEmpty}")
    private List <String> subjects;
    @NotNull(message = "{validation.birthDate.NotNull}")
    @Past(message = "{validation.birthDate.Past}")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate birthDate;
    @NotEmpty(message = "{validation.gender.NotEmpty}")
    private String gender;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public LocalDate getBirthDate() {
        return birthDate;
    }
    public void setBirthDate(LocalDate birthDate) {
        this.birthDate = birthDate;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public List <String> getSubjects() {
        return subjects;
    }
    public void setSubjects(List <String> subjects) {
        this.subjects = subjects;
    }
}
This is the code by adding Lombok annotation.
↓
package com.reytech.demo.model;
import java.time.LocalDate;
import java.util.List;
import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Positive;
import javax.validation.constraints.Size;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Student {
    @NotEmpty(message = "{validation.name.NotEmpty}")
    @Size(min = 2, max = 50, message = "{validation.name.Size}")
    private String name;
    @NotNull(message = "{validation.age.NotNull}")
    @Positive(message = "{validation.age.Positive}")
    @Max(value = 18, message = "{validation.age.Maximum}")
    private Integer age;
    @NotEmpty(message = "{validation.email.NotEmpty}")
    @Email(message = "{validation.email.Type}")
    private String email;
    @NotEmpty(message = "{validation.subjects.NotEmpty}")
    private List <String> subjects;
    @NotNull(message = "{validation.birthDate.NotNull}")
    @Past(message = "{validation.birthDate.Past}")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate birthDate;
    @NotEmpty(message = "{validation.gender.NotEmpty}")
    private String gender;
}
- @Getter and @setter will generate getters and setters according to each field.
- And, we will explain the most usable Lombok annotations which are:
| Lombok annotation | Explanation | 
|---|---|
| @data | It is all in one annotation which is equivalent to the combination of @Getter @setter @RequiredArgsConstructor @ToString @EqualsAndHashCode. | 
| @Value | It is all in one annotation which is equivalent to the combination of @Getter @FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE) @AllArgsConstructor @ToString @EqualsAndHashCode. | 
| @NoArgsConstructor | It is to generate default constructor with no arguments | 
| @RequiredArgsConstructor | It is to generate a constructor with required arguments | 
| @ AllArgsConstructor | It is to generate a constructor with all fields respectively | 
| @ToString | It is to generate the toString method automatically | 
| @RequiredArgsConstructor | It is to generate a constructor with required arguments | 
| @EqualsAndHashCode | It is to generate HashCode and equals implementations from the fields of your object. | 
| @builder | It is to generate the code automatically using Builder pattern for our class or constructor or method. | 
 

 
                       
    
Top comments (2)
Nice introduction.
I would suggest also adding the @Value annotation to your list. A lot like @Data, but instead it treats the object as immutable, so no setters, and some restriction on constructors and fields. I use it even more than @Data, to help keep a more clean object API that isn't polluted with unintended getters.
Thank you for your suggestion!