我有一个我正在为其构建报告的对象列表。该对象的一个属性是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,但是所有的例子都是指像复合列这样的事情。
这样做的正确方法是什么?
谢谢!
答案 0 :(得分:1)
JasperReports 3.7.1版(DynamicJasper 3.1.9版支持)仅支持文本字段表达式的这些类:
您可以确保从net.sf.jasperreports.engine.design.JRVerifier class:
查看此方法的源代码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&#34; org.joda.time.LocalDate&#34;文本字段表达式不支持。 net.sf.jasperreports.engine.design.JRValidationException: 报告设计无效:
- Class&#34; org.joda.time.LocalDate&#34;文本字段表达式不支持。在 net.sf.jasperreports.engine.design.JRAbstractCompiler.verifyDesign(JRAbstractCompiler.java:258) 在 net.sf.jasperreports.engine.design.JRAbstractCompiler.compileReport(JRAbstractCompiler.java:140) 在 net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:215) 在 ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperReport(DynamicJasperHelper.java:542) 在 ar.com.fdvs.dj.core.DynamicJasperHelper.generateJasperReport(DynamicJasperHelper.java:518) 在 ar.com.fdvs.dj.core.DynamicJasperHelper.generateJRXML(DynamicJasperHelper.java:403)
醇>
我认为你应该尝试使用scriptlet。这是sample。
答案 1 :(得分:1)
您可以使用一个功能,例如getLocalDateAsString
并在POJO或ValueObject中使用String的返回值实现此函数。
例如,在Layouter中
drb.addColumn("LocalType", "localTypeAsString", String.class.getName(), 50)
在实体中:
public String getLocalTypeAsString() {
String ret = null;
if (mannschaftsTyp!=null) {
ret = localType.getShortDescr();
}
return ret;
}
答案 2 :(得分:0)
请参阅http://dynamicjasper.com/2010/10/06/how-to-create-value-formatter/