将JavaBean与JasperReports API一起使用:混淆后获取java.lang.NoSuchMethodException
嗯,我的应用程序包含100多个类文件。整个应用程序在没有混淆的情况下工作正常,但在使用ProGuard混淆应用程序后,我遇到了一个奇怪的异常:将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)
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的名称,所以使用旧名称进行反射就不可能得到它的值。。。他应该接受这个…这很明显我认为。。。他应该接受这个。。。