@NonNull Lombok, вмешивающийся в javax.validation.constraints.NotNull во время проверки

Аннотация Lombok @NonNull мешает аннотации javax.validation.constraints.NotNull во время проверки в приложении с весенней загрузкой.

Я использую Lombok в своих сущностях JPA, чтобы резко сократить код в них (исключить методы получения и установки, хэш-код и равно, конструкции и т. Д.). Я использую аннотацию @NonNull для каждого обязательного поля, а затем аннотацию @RequiredArgsConstructor поверх класса, чтобы сгенерировать конструктор, принимающий только эти поля (устраняет необходимость отправлять идентификаторы объекта, UUID и наборы "один ко многим" как ноль при создание объекта).

У меня есть проблема в том, что после добавления Lombok не так давно мое оригинальное сообщение аннотации @NotNull заменяется общим сообщением Lombok для аннотации @NonNull. Взгляните на это поле, например:

@Digits(integer = 5, fraction = 0, message = "The orders port must be a number from 1 to 65 535!")
@NotNull(message = "The orders port is required!")
@Min(value = 1, message = "The orders port must be a number from 1 to 65 535!")
@Max(value = 65535, message = "The orders port must be a number from 1 to 65 535!")
@Column(nullable = false)
@NonNull
private Integer ordersPort;

Когда я ничего не помещаю в это поле, получаю это сообщение:

Property ordersPort threw exception; nested exception is java.lang.NullPointerException: ordersPort is marked @NonNull but is null

До добавления Lombok это работало нормально, и я получал сообщения, которые я поместил выше. Есть ли способ продолжать использовать Lombok, но каким-то образом отключить его от рассмотрения во время проверки?

Спасибо!

2 ответа

Решение

Поскольку lombok.NonNull будет излучать if оператор прямо в коде, который потом выкидывает NullPointerExceptionМало что можно сделать. javax.validation требует, чтобы bean-компонент был создан до его проверки, и Lombok предотвратит его.

Вы можете удалить lombok.NonNull или уменьшите его до предупреждения с lombok.nonNull.flagUsage=warning но это позволит вам создавать недопустимые объекты, которые вам придется проверять вручную javax.validation,

Итак, у меня была аналогичная проблема с Джексоном и Ломбоком.

Мне нужны были проверки javax для работы при десериализации ввода для моего контроллера, но я также хотел иметь возможность создавать экземпляры моих POJO «вручную», используя проверки Ломбока. Поскольку проверки Lombok выполнялись при создании объектов, у javax никогда не было возможности запустить проверки, поскольку сначала не удалось выполнить проверку Lombok.

Мое решение было следующим:

      import com.fasterxml.jackson.annotation.JsonCreator;
import javax.validation.constraints.NotBlank;
import lombok.Builder;
import lombok.NonNull;
import lombok.Value;

@Value
//Make immutable
public class MyObject {

    //javax annotations go here
    @NotBlank
    String fieldOne;

    //javax annotations go here
    @NotBlank
    String fieldTwo;


    //Lombok's validations go here. Lombok will create builder methods
    //for this parameters only and will rewrite this constructor to add 
    //validations
    @Builder
    private MyObject(@NonNull String fieldOne,
                     @NonNull String fieldTwo) {
        this.fieldOne = fieldOne;
        this.fieldTwo = fieldTwo;
    }

    //Constructor for jackson. No lombok validations here
    @JsonCreator
    private MyObject(String fieldOne,
                     String fieldTwo,
                     boolean jacksonHack) {
        this.fieldOne = fieldOne;
        this.fieldTwo = fieldTwo;
    }

}

Здесь вы должны убедиться, что проверки javax всегда обрабатываются после десериализации. В противном случае вы получите недопустимый объект.

Но, похоже, это работает.

Другие вопросы по тегам