将JavaBean与JasperReports API一起使用:混淆后获取java.lang.NoSuchMethodException

将JavaBean与JasperReports API一起使用:混淆后获取java.lang.NoSuchMethodException,java,swing,jasper-reports,obfuscation,Java,Swing,Jasper Reports,Obfuscation,嗯,我的应用程序包含100多个类文件。整个应用程序在没有混淆的情况下工作正常,但在使用ProGuard混淆应用程序后,我遇到了一个奇怪的异常: JRException: Error retrieving field value from bean : ID at net.sf.dynamicreports.jasper.builder.JasperReportBuilder.toJasperPrin t(JasperReportBuilder.java:319)

嗯,我的应用程序包含100多个类文件。整个应用程序在没有混淆的情况下工作正常,但在使用ProGuard混淆应用程序后,我遇到了一个奇怪的异常:

JRException: Error retrieving field value from bean : ID
        at net.sf.dynamicreports.jasper.builder.JasperReportBuilder.toJasperPrin
t(JasperReportBuilder.java:319)
        at net.sf.dynamicreports.jasper.builder.JasperReportBuilder.show(JasperR
eportBuilder.java:332)
        at ims.d.aA.done(Unknown Source)
        at javax.swing.SwingWorker$5.run(Unknown Source)
        at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.run(Unknown Sour
ce)
        at sun.swing.AccumulativeRunnable.run(Unknown Source)
        at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.actionPerformed(
Unknown Source)
        at javax.swing.Timer.fireActionPerformed(Unknown Source)
        at javax.swing.Timer$DoPostEvent.run(Unknown Source)
        at java.awt.event.InvocationEvent.dispatch(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$000(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: net.sf.jasperreports.engine.JRException: Error retrieving field value
 from bean : ID
        at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProp
erty(JRAbstractBeanDataSource.java:123)
        at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getFieldVal
ue(JRAbstractBeanDataSource.java:96)
        at net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.getFieldV
alue(JRBeanCollectionDataSource.java:100)
        at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDat
aset.java:1330)
        at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.jav
a:1231)
        at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.jav
a:1207)
        at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:
1544)
        at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVertic
alFiller.java:142)
        at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:
909)
        at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:
841)
        at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:88)
        at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.
java:653)
        at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillMa
nager.java:969)
        at net.sf.dynamicreports.jasper.builder.JasperReportBuilder.toJasperPrin
t(JasperReportBuilder.java:308)
        ... 22 more
Caused by: java.lang.NoSuchMethodException: Unknown property 'ID' on class 'clas
s ims.Reports.Item'
        at org.apache.commons.beanutils.PropertyUtilsBean.getSimpleProperty(Prop
ertyUtilsBean.java:1313)
        at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(Prop
ertyUtilsBean.java:762)
        at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUt
ilsBean.java:837)
        at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.
java:426)
        at net.sf.jasperreports.engine.data.JRAbstractBeanDataSource.getBeanProp
erty(JRAbstractBeanDataSource.java:111)
下面是要指出的bean类:

public class Item {

    private String id;
    private double quantity;
    private double unitprice;
    private String uom;
    private String iname = null;

    public String getID() {
        try {
            String query = "select name from master where company_code='" + ims.MainWindow.cc + "' and inid='" + this.id + "'";
            // System.out.println(query);
            Connection con = CPool.getConnection();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(query);
            while (rs.next()) {
                iname = rs.getString(1);
            }
            CPool.closeResultSet(rs);
            CPool.closeConnection(con);
            CPool.closeStatement(st);
        } catch (Exception x) {

        }
        return iname;
    }

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

    public double getQuantity() {
        return quantity;
    }

    public void setQuantity(double quantity) {
        this.quantity = quantity;
    }

    public double getUnitprice() {
        return unitprice;
    }

    public void setUnitprice(double unitprice) {


        this.unitprice = unitprice;
    }

    public String getUOM() {
        return uom;

    }

    public void setUOM(String u) {
        this.uom = u;
    }
}
我试着保留相关类的名称、方法,试图防止它们收缩


我还可以使用哪些开源模糊器替代方案?

我已经很长时间没有使用jasper reports了,但它似乎正在使用来获取数据。如果混淆了java Bean,则无法再通过构建名称getID()来找到属性ID的getter


我建议将此类类从混淆中排除。

我已经很长时间没有使用jasper reports了,但它似乎正在使用来获取数据。如果混淆了java Bean,则无法再通过构建名称getID()来找到属性ID的getter


我建议将此类类排除在模糊处理之外。

您是否与支持模糊处理软件的人员联系过?您是否查看过JasperReports论坛?如果您有任何其他库,这有时会导致问题。但是它仍然可以工作到混淆级别8。尝试将get/set方法
getID/setID
更改为
getID/setID
JasperReports使用
org.apache.commons.beanutils.PropertyUtils
获取属性值,而PropertyUtils通过反射工作。混淆器更改bean getter/setter名称,因此无法使用旧名称通过反射获取其值。您是否与支持混淆软件的人员联系过?您是否查看过JasperReports论坛?如果您有任何其他库,这有时会导致问题。但是它仍然可以工作到混淆级别8。尝试将get/set方法
getID/setID
更改为
getID/setID
JasperReports使用
org.apache.commons.beanutils.PropertyUtils
获取属性值,而PropertyUtils通过反射工作。混淆器更改了bean getter/setter的名称,所以使用旧名称进行反射就不可能得到它的值。。。他应该接受这个…这很明显我认为。。。他应该接受这个。。。