65
votes


One of my POJOs has a Boolean object field to permit NULLS in the database (a requirement). Is it possible to use the @Data Lombok annotation at class level yet override the getter for the Boolean field? The default it generates is getXXX method for the Boolean field. I wish to override it as isXXX()?

Thanks,
Paddy

5
By definition, overriding means, writing your own getXXX for that provided by lombok. If you want to add your own isXXX, it's a different method. Why don't you create an isXXX in your POJO and in the implementation, call getXXX if required or implement it the way you like? - Jayz
I have declared @Data at class level and have too many attributes in the class, so excluding getter or making the default getter private for one field will be tough. Otherwise, even if I add a isXXX method, the getXXX method will be still visible to users of the class anyway - I would rather then use the getXXX method itself. I hope you understand my context. - Paddy

5 Answers

112
votes

It's a bit verbose, but you can provide your own isXXX, and then use AccessLevel.NONE to tell Lombok not to generate the getXXX:

@Data
public class OneOfPaddysPojos {

    // ... other fields ...

    @Getter(AccessLevel.NONE)
    private Boolean XXX;

    public Boolean isXXX() {
        return XXX;
    }
}

(And hey, at least it's not quite as verbose as if you weren't using Lombok to begin with!)

16
votes

I think if you switch your field from Boolean X to boolean X than lombok generate a getter isX() method.

6
votes

I know the question is old but I will leave this for future references.

You have two options to override a Getter/Setter in your class.

One is the answer from First Option response

The other option is to simply define the getter/setter method and lombok will not automatically produce the specified method.

I tested it myself and it seems to work fine:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ProductResponse {

    private UUID id;
    private String supplierId;
    private String sku;
    private String name;
    private String brand;
    private String imgUrl;
    private String description;
    private BigDecimal price;
    private Float quantity;
    private String unit;
    //@Getter(AccessLevel.NONE) //This means @Data will not produce a getter for this field so have to explicitly define it
    private Set<ProductTag> tags;

    //Here we override @Data getter with a different getter (return is different type)
    public List<UUID> getTags() {
    return     tags.stream().map(ProductTag::getId).collect(Collectors.toList());
    }
}

Here is also a reference from the development team comments: Lombok's developer comment

In my example I'm using the "override" feature for a Collection type but this can be used for any other type like Boolean in your case.

2
votes

what is the name of boolean field? according to the lombok doc:

A default getter simply returns the field, and is named getFoo if the field is called foo (or isFoo if the field's type is boolean)

lombok will generate getter with name isXXX for your boolean field

1
votes

From Lombok documentation:

You can always manually disable getter/setter generation for any field by using the special AccessLevel.NONE access level. This lets you override the behaviour of a @Getter, @Setter or @Data annotation on a class.