Приветствую всех, чтобы обратить вниманиеGitHub.com/ очень удобный журнал/ просто…, я надеюсь, что это будет полезно для всех. Если вы считаете, что это возможно, пожалуйста, нажмите звездочку.
Перепечатано с:Блог Woohoo.cn на.com/ZZwenah/afraid/13…
Обычно при определении класса сущностей Java для логического атрибута закон Али четко требует, чтобы начало is не могло использоваться.
А почему, мы поговорим об этом позже.
Здесь же поговорим о проблеме, возникшей в проекте несколько дней назад на работе. Строка json класса сущности хранится в поле в таблице библиотеки.После запроса таблицы библиотеки вам нужно преобразовать строку json в объект класса сущности, изменить ее, а затем преобразовать в строку json и вернуть. к переднему концу.
В этом есть проблема, данные, хранящиеся в библиотечной таблице, явноisUpdate, но код после возврата во внешний интерфейсupdate.
Эта проблема, сначала я не думал, что это проблема определения поля, через пошаговую отладку,В итоге выяснилось, что проблема в поле isUpdate в классе сущности, после парсинга через json оно конвертировалось в update и возвращалось на фронтенд.
Давайте поговорим о том, почему isUpdate становится проблемой обновления.
Во-первых, давайте определим класс сущности Java, который содержит атрибут, начинающийся с is, например isSuccess, а затем воспользуемся функцией get/set, автоматически созданной idea, чтобы посмотреть, как это выглядит.
public class IsEntity1 {
private boolean isSuccess;
public boolean isSuccess() {
return isSuccess;
}
public void setSuccess(boolean success) {
isSuccess = success;
}
}
Затем определите класс сущностей Java вместо атрибутов, начинающихся с is, таких как успех, а затем используйте функцию get/set, автоматически сгенерированную idea, чтобы увидеть, как это выглядит.
public class IsEntity2 {
private boolean success;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
}
На этом этапе вы обнаружите, что вне зависимости от того, определяете ли вы свойства с помощью is или нет, get/set, автоматически сгенерированный idea, будет одним и тем же, а когда setSuccess, is будет опущен. Вот проблема, с которой столкнулись в проекте.
Потому что при сериализации класса сериализация некоторых фреймворков будет сериализована в соответствии со свойствами JavaBean, а некоторые фреймворки будут сериализованы в соответствии с методом получения JavaBean, что приведет к тому, что свойства класса сущностей будут соответствовать свойства класса сущностей во время десериализации.
Например, будетIsEntity1При преобразовании в строку json значение isSuccess будет сериализовано в соответствии с методом get в классе сущностей, а метод get, автоматически сгенерированный idea, является непосредственно общедоступным логическим методом isSuccess(), когда значение будет принято, оно будет быть определено, что успех является именем поля, он будет принят как успех, который отличается от первоначально определенного поля.
Если вам нужно использовать начало is для определения полей, как вы можете убедиться, что процесс синтаксического анализа json выполнен правильно?
Ответ заключается в том, чтобы написать метод get самостоятельно, а не в методе get, автоматически сгенерированном idea.
следующее:
public boolean getIsSuccess() {
return isSuccess;
}
Таким образом, когда класс сущности преобразуется в строку json, isSuccess будет идентифицирован как имя поля.
Другой способ — использовать аннотацию JSONField.
@JSONField(name = "isSuccess")
private boolean isSuccess;
Хотя эти методы могут решить проблему потери is в процессе парсинга json, чтобы избежать этой проблемы, нам лучше следовать протоколу и не определять поля в начале is.
анализировать:
Объявите свойство, а затем используйте Генератор, который поставляется с идеей, чтобы сгенерировать геттер и сеттер (тип пакета отличается от базового типа данных), следующим образом:
Когда я перехожу к созданию PropertyDescriptor, я получаю сообщение об ошибке
Позже я проследил за кодом и обнаружил, что причина ошибки заключалась в том, что когда конструктор PropertyDescriptor искал функцию записи значения с именем setIsSuccess, было обнаружено, что она не может быть найдена, поэтому было сообщено об ошибке.
Как видно из приведенного выше рисунка, при фактическом построении PropertyDescriptor он попытается найти функцию чтения с именем isIsSuccess и функцию записи с именем setIsSuccess. Когда isIsSuccess не найден, он попытается найти функцию чтения с именем getIsSuccess, и если она не будет найдена, будет сгенерировано исключение. Исключение также выдается, когда setIsSuccess не найден.
Я попробовал это и обнаружил, что геттер автоматически генерируется по идее, а сеттер имеет эту проблему только при использовании логического значения, которое начинается с is (есть проблемы как с типом инкапсуляции, так и с базовым типом данных), а другие типы данных делают нет этой проблемы.
Эта проблема иногда также связана с преобразованием json, поэтому при работе с логическими данными и именовании их с помощью is не используйте идею для автоматического создания геттеров и сеттеров. Кроме того, в отрасли кажется более разумным запрещать переменные типа boolean с is в начале bean-компонента.