Уже есть автоматически сгенерированные классы, которые я не имел никакого отношения к объявлению имен их полей.Пытаясь использовать 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'
)