Java Reflection / BeanUtils问题

时间:2014-02-12 19:52:22

标签: java reflection javabeans

我正在尝试使用一些表驱动的属性:值对来填充bean。我从MySQL表中检索它们,并正好填充一个hashmap。我遍历hashmap,如果我使用PropertyUtils.setProperty(),我得到一个“类没有setter for *”错误。如果我使用BeanUtils.setProperty(),bean永远不会被填充。这是样本:

public class DBDrivenPayloadHandler extends GDE{
DbDrivenPayloadHandlerBean bean;

@SuppressWarnings("rawtypes")
public void populateBean() throws Exception {
    ITransaction trans = new MySQLTransaction();
    IAdapterDataMapDAO adapterDataMap = new MySQLAdapterDataMapDAO();
    adapterDataMap.setTransaction(trans);

    HashMap<String, String> values = adapterDataMap.getHashMap(super.getCurrentAccountId()); 
    //hashmap gets populated correctly with correct variable names and values != "-1";

    DbDrivenPayloadHandlerBean bean = new DbDrivenPayloadHandlerBean(); 
    //We have a bean with all the intialized variable values

    Iterator it = values.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry entry = (Map.Entry)it.next();
        try {
            PropertyUtils.setProperty(bean, (String) entry.getKey(), entry.getValue()); 
            //PropertyUtils will give a setter not found error. BeanUtils never sets the values. 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public void getInfo(String fileName) {
    try {
        populateBean();
    } catch (Exception e) {
        e.printStackTrace();
    }
    APPTS_FULLNAME_POS = bean.getAPPTS_FULLNAME_POS();
    APPTS_DATETIME_POS = bean.getAPPTS_DATETIME_POS();
    //Both still -1;
    super.getInfo(filename);
}

这是Bean(或者至少是其中的一部分):

public class DbDrivenPayloadHandlerBean {
int APPTS_FULLNAME_POS = -1;
int APPTS_DATETIME_POS = -1;


public DbDrivenPayloadHandlerBean() {
    super();
}

public int getAPPTS_FULLNAME_POS() {
    return APPTS_FULLNAME_POS;
}

public void setAPPTS_FULLNAME_POS(String APPTS_FULLNAME_POS) {
    this.APPTS_FULLNAME_POS = Integer.parseInt(APPTS_FULLNAME_POS);
}   

public int getAPPTS_DATETIME_POS() {
    return APPTS_DATETIME_POS;
}

public void setAPPTS_DATETIME_POS(String APPTS_DATETIME_POS) {
    this.APPTS_DATETIME_POS = Integer.parseInt(APPTS_DATETIME_POS);
}

很抱歉,BeanUtils可以解决这个问题。我只是不想允许使用字符串的字符串。我想反射会为你做演员。道歉。

1 个答案:

答案 0 :(得分:0)

如上所述的解决方案:不要尝试为BeanUtils强制转换。

public class DBDrivenPayloadHandler extends GDE{
DbDrivenPayloadHandlerBean bean;

@SuppressWarnings("rawtypes")
public void populateBean() throws Exception {
    ITransaction trans = new MySQLTransaction();
    IAdapterDataMapDAO adapterDataMap = new MySQLAdapterDataMapDAO();
    adapterDataMap.setTransaction(trans);

    HashMap<String, String> values = adapterDataMap.getHashMap(super.getCurrentAccountId());        
    this.bean = new DbDrivenPayloadHandlerBean(); 

    Iterator it = values.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry entry = (Map.Entry)it.next();
        try {
            BeanUtils.setProperty(bean, (String) entry.getKey(), entry.getValue()); 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public void getInfo(String fileName) {
    try {
        populateBean();
    } catch (Exception e) {
        e.printStackTrace();
    }
    APPTS_FULLNAME_POS = bean.getAPPTS_FULLNAME_POS();
    APPTS_DATETIME_POS = bean.getAPPTS_DATETIME_POS();
    //Both still -1;
    super.getInfo(filename);
}

public class DbDrivenPayloadHandlerBean {
int APPTS_FULLNAME_POS = -1;
int APPTS_DATETIME_POS = -1;


public DbDrivenPayloadHandlerBean() {
    super();
}

public int getAPPTS_FULLNAME_POS() {
    return APPTS_FULLNAME_POS;
}

public void setAPPTS_FULLNAME_POS(int APPTS_FULLNAME_POS) {
    this.APPTS_FULLNAME_POS = APPTS_FULLNAME_POS;
}   

public int getAPPTS_DATETIME_POS() {
    return APPTS_DATETIME_POS;
}

public void setAPPTS_DATETIME_POS(String APPTS_DATETIME_POS) {
    this.APPTS_DATETIME_POS = APPTS_DATETIME_POS;
}