Java BeanUtils Unknown属性带有下划线(_)

时间:2019-07-17 04:36:38

标签: java apache-commons apache-commons-beanutils

我无法使用import { Injectable } from '@angular/core'; import { adal } from 'adal-angular'; import { Observable, Subscriber } from 'rxjs'; import { retry } from 'rxjs/operators'; import { AdalConfigService } from './adal-config.service'; declare var AuthenticationContext: adal.AuthenticationContextStatic; let createAuthContextFn: adal.AuthenticationContextStatic = AuthenticationContext; @Injectable({ providedIn: 'root', }) export class AdalService { private context: adal.AuthenticationContext; constructor(private configService: AdalConfigService) { this.context = new createAuthContextFn(configService.adalSettings); } 从类中获得带下划线(例如User_Name)的属性,它总是抛出错误:

  

“类'User'上的未知属性'User_Name'”。

但是当我调试bean时,它具有User_Name属性。

BeanUtils.getProperty(bean, property)

User类是

BeanUtils.getProperty(bean, propertyName);

1 个答案:

答案 0 :(得分:1)

这是命名约定的问题。您可以参考Where is the JavaBean property naming convention defined?进行参考。来自JavaBeans API specification

的8.8节
  

...   因此,当我们从现有Java名称的中间提取属性或事件名称时,通常会将第一个字符转换为小写 * case 1 。但是要支持偶尔使用所有   大写的名称,我们检查名称的前两个字符 * case 2 是否均为大写,以及   所以不要管它。例如,

     
    

“ FooBah”成为“ fooBah”
    'Z'变成'z'
    “ URL”变为“ URL”

  
     

我们提供了Introspector.decapitalize方法,该方法实现了此转换规则

因此,对于您给定的班级,该属性是根据getUser_Name()setUser_Name()推导出来的 根据* case1是“ user_Name”而不是“ User_Name”。并根据* case 2来调用getProperty(bean, "ID")

要解决此问题,请根据Java命名约定更新命名,我们应以小写字母开头的属性和方法,并使用 camelCase 代替 snake_case 分隔单词。请记住,遵循约定在编程中确实很重要。下面以更新的类为例。

import java.lang.reflect.InvocationTargetException;

import org.apache.commons.beanutils.BeanUtils;

public class User {
    private String ID;
    private String userName;

    public String getID() {
        return ID;
    }

    public void setID(String ID) {
        this.ID = ID;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public static void main(String[] args)
            throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        User bean = new User();
        bean.setUserName("name");
        System.out.println(BeanUtils.getProperty(bean, "userName"));
    }
}