Я использую ломбок в своем проекте и генерирую Setters и Getters, используя аннотации @Setters и @Getters поверх класса POJO. Я пытаюсь переопределить метод установки свойства, но он не работает
Я хочу проверить, является ли свойство JSON пустым или пустым. Я хочу установить значение по умолчанию в методе Setter.
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@ToString
public class DefaultModel {
private String name;
@Setter(AccessLevel.NONE)private String age;
public void setAge(String age) {
if (age==null||age.trim().isEmpty()||age.equals("null")) {
this.age = "10";
}else {
this.age=age;
}
}
}
Сценарии работы:
{
"name":"some",
"age":null
}
{
"name":"some",
"age":"null"
}
{
"name":"some",
"age":" "
}
Неудачный сценарий:
{
"name":"some"
}
Выход:
DefaultModel(name=some, age=null)
И я следую этому как ссылку также здесь, но пока не повезло
Также не имеет отношения: почему ваш атрибут age относится к String?
Не так уж и несвязано: age.equals(null) - этот тест либо вернет false, либо выдаст NullPointerException (это связано с комментарием @GhostCat).
@GhostCat Lombok творит темную магию в форме недокументированных вызовов API компилятора. Насколько мне известно, они работают с AST, но я не знаю, удаляют ли они существующие узлы (например, существующие сеттеры).
но на самом деле это все безумие, как насчет того, чтобы использовать уровни переменных геттеров и сеттеров ломбока, я имею в виду удаление поверх класса и объявление для каждой переменной, если это необходимо?
@Deadpool вы когда-нибудь задавали имя в неудачном сценарии? Если да, то как?
Несвязанный: вы должны использовать @Data вместо аннотации с @Getter и @Setter. @Data - это ярлык для них и включает @ToString и @EqualsAndHashCode.




Либо вы обнаружили ошибку, которую я никогда не видел, либо вы ее неправильно тестируете.
Аннотации вроде
@Setter(AccessLevel.NONE) private String age;
на уровне поля действительно останавливает создание сеттера. Но, учитывая, что вы определяете сеттер, он вам даже не нужен. Явный @Setter также останавливает генерацию.
Я только что пробовал ваш пример, используя Eclipse 4.7.3a и Lombok 1.18.0, и вызывается ваш (ошибочный) установщик. Я много использовал Lombok в течение нескольких лет и никогда не сталкивался с такой ошибкой.
Скорее всего, проблема в том, что ваш десериализатор JSON вообще не использует сеттеры. Я думаю, вы тестируете что-то вроде
DefaultModel defaultModel = deserialize("{\"name\":\"some\"}", DefaultModel.class);
вместо того, чтобы напрямую тестировать сеттер. И вот в чем проблема.
@Deadpool Не знаю, как работает почтальон, но держу пари, что он не использует сеттеров. GSON их тоже не использует.
@maaartinus согласен с вами, поэтому спросил @Deadpool (OP), если он / она когда-либо устанавливал имя в неудачном сценарии (вызовите установщик) ... потому что я проверено это тоже, и он работает, вещь с null - это сериализация / проблема десериализации, никак не связанная с loombok.
Спасибо за разъяснения, согласен с вами, это проблема с десериализацией недостающих полей в теле JSON.
Возможно, десериализатор JSON использует конструктор, созданный Lombok (а не сеттеры).
Взгляните сюда: Отсутствуют значения по умолчанию для десериализации Джексона
Не связано: возможно, вы проверите, что
age! = Null перед вы вызываетеisEmpty()на нем ...