Lombok @SuperBuilder workaround on IntelliJ

drenda picture drenda · Apr 25, 2019 · Viewed 11.1k times · Source

I've a class Product:

   @Data
   @SuperBuilder
   public class Product {

        private String name;
        private String manufacturer;

   }

and an extended class

@Data
@SuperBuilder
public class Frame extends Product{

   private String model;

}

I'm trying to create a Frame object using the builder:

 return Frame.builder() 
        .name("Frame ABC")
        .manufacturer("Manufacturer")
        .model("Model 1")
        .build();

I'm using IntelliJ 2019.1.1 with Lombok plugin but unfortunately the compiler marks as error the .name() and .manufacturer() methods. I saw this issue opened and I'm wondering if there is a workaround to make my code to work.

Answer

desr picture desr · May 5, 2019

No, not until the issue is resolved.

Its a chicken and egg issue. Until the classes with the @SuperBuilder annotations are compiled, the actual generated builder methods do not exist. The plugin (once updated/fixed) works with the IDE for these methods so that even though they don't exist yet, the plugin tells the IDE what they will be when compilation takes place.

There are ways to 'cheat' but they are all hacks - for example, you could compile your (super)builder classes in their own jar and then import that jar into your project. As you compiled the SuperBuilder classes they now contain all the generated methods, thus the IDE will see the actual methods and will therefore propose them if you try use them. Functional but not very useful... if you need to update the SuperBuilder annotated classes, you now have to compile them each time before the changes become visible. Obviously you could create build tasks to do this for you, but you are always working around the actual issue which is plugin support.