我有一个正在为其构建报告的对象列表。该对象的属性之一是 JodaTime LocalDate 对象。我希望将此日期包含在我的报告中,因此我会执行以下操作:
.addColumn("Shipout", "shipout", LocalDate.class.getName(),50)
这会导致以下错误:
net.sf.jasperreports.engine.design.JRValidationException: Report design not valid :
1. Class "org.joda.time.LocalDate" not supported for text field expression.
那很好,但必须有某种方法可以添加 LocalDate 列类型 - 我在文档中找不到类似的内容。
我能找到的最接近的是 CustomExpression,但所有示例都涉及执行诸如复合列之类的操作。
正确的做法是什么?
谢谢!
最佳答案
JasperReports 版本 3.7.1(受 DynamicJasper 版本 3.1.9 支持)仅支持文本字段表达式的此类:
- java.lang.Boolean
- java.lang.Byte
- java.util.Date
- java.sql.Timestamp
- java.sql.Time
- java.lang.Double
- java.lang.Float
- java.lang.Integer
- java.lang.Long
- java.lang.Short
- java.math.BigDecimal
- java.lang.Number
- java.lang.String
您可以通过查看此方法的源代码来确定这一事实 net.sf.jasperreports.engine.design.JRVerifier类:
private static synchronized String[] getTextFieldClassNames()
{
if (textFieldClassNames == null)
{
textFieldClassNames = new String[]
{
java.lang.Boolean.class.getName(),
java.lang.Byte.class.getName(),
java.util.Date.class.getName(),
java.sql.Timestamp.class.getName(),
java.sql.Time.class.getName(),
java.lang.Double.class.getName(),
java.lang.Float.class.getName(),
java.lang.Integer.class.getName(),
java.lang.Long.class.getName(),
java.lang.Short.class.getName(),
java.math.BigDecimal.class.getName(),
java.lang.Number.class.getName(),
java.lang.String.class.getName()
};
Arrays.sort(textFieldClassNames);
}
return textFieldClassNames;
}
private void verifyTextField(JRTextField textField)
{
verifyReportElement(textField);
verifyFont(textField);
verifyAnchor(textField);
verifyHyperlink(textField);
if (textField != null)
{
JRExpression expression = textField.getExpression();
if (expression != null)
{
try
{
String className = expression.getValueClassName();
if (className == null)
{
addBrokenRule("Class not set for text field expression.", expression);
}
else if (Arrays.binarySearch(getTextFieldClassNames(), className) < 0)
{
addBrokenRule("Class \"" + className + "\" not supported for text field expression.", expression);
}
}
catch (JRRuntimeException e)
{
addBrokenRule(e, expression);
}
}
}
}
如您所见,verifyTextField
方法会在您的案例中生成此消息。
完整的堆栈跟踪:
- Class "org.joda.time.LocalDate" not supported for text field expression. net.sf.jasperreports.engine.design.JRValidationException: Report design not valid :
- Class "org.joda.time.LocalDate" not supported for text field expression. at net.sf.jasperreports.engine.design.JRAbstractCompiler.verifyDesign(JRAbstractCompiler.java:258) at net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:140) at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:215) at ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperReport(DynamicJasperHelper.java:542) at ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperReport(DynamicJasperHelper.java:518) at ar.com.fdvs.dj.core.DynamicJasperHelper.generateJRXML(DynamicJasperHelper.java:403)
我认为你应该尝试使用 scriptlet。这是sample .
关于java - DynamicJasper 将列添加到具有不支持的数据类型的 fastreportbuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8030237/