Lombok in Spring

Lombok makes Java prettier, and your life easier.

Why do you want to use Lombok

  1. Eliminate Java Boilerplate
  2. Avoid Repetitive Code
  3. The Builder Pattern
  4. Logger

How to use in your Spring project

Gradle plugin

Makes it easy to deploy. See io.freefair.lombok.

Gradle Built-in

tell Gradle to add Lombok only during compilation. See build.gradle

repositories {

dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.10'
    annotationProcessor 'org.projectlombok:lombok:1.18.10'

My favourite Lombok features

1. @Getter/@Setter

  1. put a @Getter and/or @Setter annotation on a class. In that case, it’s as if you annotate all the non-static fields in that class with the annotation.
  2. Disable setter or getter: AccessLevel.NONE
  3. @Accessors(fluent=true)

     class myEntity{
         private String name;

2. @ToString

  1. By default, all non-static fields will be printed.
  2. skip some fields, you can annotate these fields with @ToString.Exclude.
  3. @ToString can also be used on an enum definition.

     public class myEntity {
         private AnotherEntity anotherEntity;

3. @EqualsAndHashCode

public class myEntity {

    private AnotherEntity anotherEntity;

4. @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor, and access level of constructors

  • @NoArgsConstructor will generate a constructor with no parameters.
  • @RequiredArgsConstructor generates a constructor with 1 parameter for each field that requires special handling. All non-initialized final fields get a parameter, as well as any fields that are marked as @NonNull that aren’t initialized where they are declared.
  • @AllArgsConstructor generates a constructor with 1 parameter for each field in your class. Fields marked with @NonNull result in null checks on those parameters.

Control access level of constructor

If you use annotations to generate a constructor, by default the access level of the constructor is public. You need to use the parameter to control the access level: @ NoArgsConstructor (access = AccessLevel.PRIVATE)

5. @Data

A shortcut for @ToString, @EqualsAndHashCode, @Getter on all fields, @Setter on all non-final fields, and @RequiredArgsConstructor

6. @Log

You put the variant of @Log on your class (whichever one applies to the logging system you use); you then have a static final log field, initialized as is the commonly prescribed way for the logging framework you use, which you can then use to write log statements.

@Slf4j Creates

private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
public class LogExampleOther {
  public static void main(String... args) {
    log.error("Something else is wrong here");

7. @Builder

  1. The @Builder annotation produces complex builder APIs for your classes.
  2. @Builder can be placed on a class, or on a constructor, or on a method.

     public class BuilderExample {
       private long created = System.currentTimeMillis();
       private String name;
       private int age;
       private Set<String> occupations;