Как переопределить методы Lombok Setter

Я использую ломбок в своем проекте и генерирую 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! = Null перед вы вызываете isEmpty() на нем ...

GhostCat 17.07.2018 21:02

Также не имеет отношения: почему ваш атрибут age относится к String?

Turing85 17.07.2018 21:03

Не так уж и несвязано: age.equals(null) - этот тест либо вернет false, либо выдаст NullPointerException (это связано с комментарием @GhostCat).

Turing85 17.07.2018 21:07

@GhostCat Lombok творит темную магию в форме недокументированных вызовов API компилятора. Насколько мне известно, они работают с AST, но я не знаю, удаляют ли они существующие узлы (например, существующие сеттеры).

Turing85 17.07.2018 21:11

но на самом деле это все безумие, как насчет того, чтобы использовать уровни переменных геттеров и сеттеров ломбока, я имею в виду удаление поверх класса и объявление для каждой переменной, если это необходимо?

Deadpool 17.07.2018 21:16

@Deadpool вы когда-нибудь задавали имя в неудачном сценарии? Если да, то как?

lealceldeiro 17.07.2018 21:32

Несвязанный: вы должны использовать @Data вместо аннотации с @Getter и @Setter. @Data - это ярлык для них и включает @ToString и @EqualsAndHashCode.

shimatai 17.07.2018 22:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
15
7
26 657
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Либо вы обнаружили ошибку, которую я никогда не видел, либо вы ее неправильно тестируете.

Аннотации вроде

@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 17.07.2018 22:30

@maaartinus согласен с вами, поэтому спросил @Deadpool (OP), если он / она когда-либо устанавливал имя в неудачном сценарии (вызовите установщик) ... потому что я проверено это тоже, и он работает, вещь с null - это сериализация / проблема десериализации, никак не связанная с loombok.

lealceldeiro 17.07.2018 23:28

Спасибо за разъяснения, согласен с вами, это проблема с десериализацией недостающих полей в теле JSON.

Deadpool 17.07.2018 23:42

Возможно, десериализатор JSON использует конструктор, созданный Lombok (а не сеттеры).

Взгляните сюда: Отсутствуют значения по умолчанию для десериализации Джексона

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