【问题标题】:BeanUtils.setProperty method sets null a BigDecimal fieldBeanUtils.setProperty 方法将 BigDecimal 字段设置为 null
【发布时间】:2018-05-24 02:42:38
【问题描述】:

我在使用 BeanUtils.setProperty 方法时遇到问题。 我正在使用这个 JAR:

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.3</version>
</dependency>

我运行一个返回一条记录的 MySQL 查询,并将结果集映射到我创建的 JavaBean。 这里有主类。

public class QueryTester {

    public static void viewTable(Connection con) throws SQLException, InstantiationException, IllegalAccessException, InvocationTargetException {
        Statement stmt = null;
        String query = "SELECT * FROM Books WHERE code = 'AA00'";
        try {
            stmt = (Statement) con.createStatement();
            ResultSet rs = stmt.executeQuery(query);    
            ResultSetMapper<Books> rsMapper = new ResultSetMapper<Books>();
            List<Books> list = rsMapper.mapResultSetToObject(rs, Books.class);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (stmt != null) {
                stmt.close();
            }
        }
    }

    public static void main(String[] args) {
        Connection conn = null;
        String url = "jdbc:mysql://localhost/dbname";
        String driver = "com.mysql.jdbc.Driver";
        String userName = "root";
        String password = "root";
        try {
          Class.forName(driver).newInstance();
          conn = (Connection) DriverManager.getConnection(url,userName,password);
          viewTable(conn);
          conn.close();
        } catch (Exception e) {
            System.out.println("NO CONNECTION");
        }
    }
}

这就是使用 BeanUtils.setProperty 方法的方法。

public class ResultSetMapper<T> {
    public List<T> mapResultSetToObject(ResultSet rs, Class<T> outputClass) throws InstantiationException, SQLException, IllegalAccessException, InvocationTargetException {
        List<T> outputList = new ArrayList<T>();
        if (rs == null) {
            return outputList;
        }
        if (!outputClass.isAnnotationPresent(Entity.class)) {
            throw new InstantiationException("Entity notation not present.");
        }

        ResultSetMetaData rsmd = rs.getMetaData();
        // retrieve data fields from output class
        Field[] fields = outputClass.getDeclaredFields();
        while (rs.next()) {
            T bean = (T) outputClass.newInstance();
            for (int iterator = 0; iterator < rsmd.getColumnCount(); iterator++) {  
                String columnName = rsmd.getColumnName(iterator + 1);
                Object columnValue = rs.getObject(iterator + 1);
                for (Field field : fields) {
                    if (field.isAnnotationPresent(Column.class)) {
                        Column column = field.getAnnotation(Column.class);
                        if (column.name().equalsIgnoreCase(columnName) && columnValue != null) {
                            BeanUtils.setProperty(bean, field.getName(), columnValue);
                            break;
                        }
                    }
                }
            }
            outputList.add(bean);
        }
        return outputList;
    }
}

mapResultSetToObject 方法返回一个列表,其中包含一个正确的元素,但 bean 的设置方式错误。 字段 code 和 bookDescription 设置正确,但 kPrice 字段设置为 null 而不是数据库中的值 3.000。 我在调试模式下运行此代码,“columnValue”变量的值为 3.000,但 setProperty 方法未设置正确的值,该值仍为 null。

这里有我的 Java Bean。

@Entity
public class Books {

    @Column(name="code")
    private String code;
    @Column(name="book_description")
    private String bookDescription;
    @Column(name="kPrice")
    private BigDecimal kPrice;

    public Books() {}

    public Books(String code, String bookDescription, BigDecimal kPrice){
        this.code = code;
        this.bookDescription = bookDescription;
        this.kPrice = kPrice;
    }

    /* Getters and setters */
    ...
}

这是 MySQL 表和记录。

CREATE TABLE `Books` (
  `code` varchar(4) NOT NULL,
  `book_description` varchar(50) NOT NULL DEFAULT '',
  `kPrice` decimal(10,4) NOT NULL DEFAULT '1.0000',
  PRIMARY KEY (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

INSERT INTO dbname.Books (code, book_description, kPrice) VALUES('AA00', 'Description example', 3.0000);

为什么我会出现这种行为?我错过了什么? 提前致谢

【问题讨论】:

    标签: java mysql bigdecimal apache-commons-beanutils


    【解决方案1】:

    你确定哪个setter/getter的名字和property是一样的吗?

    在某些情况下,问题是这样的。

    请参阅下面的示例:

    @Entity
    public class Books {
    
        @Column(name="code")
        private String code;
        @Column(name="book_description")
        private String bookDescription;
        @Column(name="kPrice")
        private BigDecimal kPrice;
    
        public Books() {}
    
        public Books(String code, String bookDescription, BigDecimal kPrice){
            this.code = code;
            this.bookDescription = bookDescription;
            this.kPrice = kPrice;
        }
    
        public void setKPrice ( Bigdecimal kPrice) // and not setkPrice or setPrice..
       {
           this.kPrice = kPrice;
       }
    
       public BigDecimal getKPrice () // and not getkPrice or getPrice..
       {
           return this.kPrice;
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 2022-07-22
      • 2012-05-09
      • 2016-06-26
      • 1970-01-01
      • 2012-09-05
      • 2021-06-09
      相关资源
      最近更新 更多