BeanUtils.setProperty方法将null设置为BigDecimal字段

时间:2017-12-10 11:20:59

标签: java mysql bigdecimal apache-commons-beanutils

我在使用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方法返回一个List,其中一个元素是正确的,但bean的设置方式错误。 字段代码和bookDescription设置正确,但kPrice字段设置为null而不是3.000,即数据库中的值。 我在调试模式和&#34; columnValue&#34;中运行此代码变量的值为3.000,但setProperty方法没有设置正确的值,值仍为空。

这里有我的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);

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

1 个答案:

答案 0 :(得分:0)

您确定setter / getters的名称与属性相同吗?

在某些情况下,问题在于。

请参阅下面的示例:

@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;
   }
}