Использование полей, начинающихся с одной строчной буквы в org.apache.commons.beanutils.PropertyUtils.getNestedProperty () - PullRequest
0 голосов
/ 24 июня 2019

Уже есть автоматически сгенерированные классы, которые я не имел никакого отношения к объявлению имен их полей.Пытаясь использовать org.apache.commons.beanutils.PropertyUtils.getNestedProperty(Object bean, String name) для получения поля типа объекта класса, я обнаружил ошибку:

java.lang.NoSuchMethodException: неизвестное свойство 'lSASPro' в классе 'xyz'

Проблемное имя поля - это что-то вроде lSASPro или что-то подобное, начиная последовательно с одной строчной и одной заглавной буквы.(lSASPro превратится в LSASPro на шаге PropertyDescriptor, поэтому getPropertyDescriptor() в приведенном ниже коде возвращает нуль

// The file: org.apache.commons.beanutils.PropertyUtilsBean.java

// Retrieve the property getter method for the specified property
final PropertyDescriptor descriptor =
        getPropertyDescriptor(bean, name);
if (descriptor == null) {
    throw new NoSuchMethodException("Unknown property '" +
            name + "' on class '" + bean.getClass() + "'" );
}

Это из-за объявленного поведения PropertyDescriptor вJava Beans, который получает имя поля со следующими спецификациями ( source ):

Таким образом, когда мы извлекаем имя свойства или события из середины существующего имени Java, мыобычно преобразуют первый символ в нижний регистр. Однако, чтобы поддерживать случайное использование всех имен в верхнем регистре, мы проверяем, являются ли первые два символа имени заглавными, и если это так, оставляем его в покое. Так, например:

  • FooBah становится fooBah
  • Z становится z
  • URL становится URL

Мыпредоставить метод Introspector.decapitalize, который реализует это правило преобразования.


, который должен передаваться PropertyUtils.getNestedProperty() в качестве второго аргумента, чтобы он обрабатывал имена полей, такие как lSASPro?


Here предлагается использовать что-то вроде "ClassName.lSASPro" в качестве второго аргумента (имя поля), но это не будет работать для полей первого уровня с такими именами (т.е.Он не будет работать для поля lSASPro в классе Test следующим образом: PropertyUtils.getNestedProperty(Test, lSASPro), поскольку мы не можем передать "Test.lSASPro" в качестве второго аргумента, в противном случае он жалуется Unknown property Test.lSASPro on class 'Test')

...