@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 всегда обрабатываются после десериализации. В противном случае вы получите недопустимый объект.
Но, похоже, это работает.