为了账号安全,请及时绑定邮箱和手机立即绑定

带有下划线 (_) 的 Java BeanUtils 未知属性

带有下划线 (_) 的 Java BeanUtils 未知属性

繁华开满天机 2023-03-31 09:31:05
我无法从使用 的类中获取带下划线的属性(例如:User_Name)BeanUtils.getProperty(bean, property),它总是抛出错误:“类‘User’上的未知属性‘User_Name’”。但是当我调试 bean 时,它具有 User_Name 属性。BeanUtils.getProperty(bean, propertyName);用户类是public class User {    private String ID;    private String User_Name;    public void setID(String ID) {        this.ID = ID;    }    public String getUser_Name() {        return this.User_Name;    }    public void setUser_Name(String user_Name) {        this.User_Name = user_Name;    }}
查看完整描述

1 回答

?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

这是命名约定的问题。

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

'FooBah' 变成 'fooBah'
'Z' 变成 'z'
'URL' 变成 'URL'

我们提供了一个 Introspector.decapitalize 方法来实现这个转换规则

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

为解决该问题,请根据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"));

    }

}


查看完整回答
反对 回复 2023-03-31
  • 1 回答
  • 0 关注
  • 164 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信