我使用 iReport 设计报告。在这个报告中,我有一个自定义函数,它将年份和月份作为输入并返回该月份的最大天数。
此方法在内部使用 java.util.Calendar API获取给定月份和年份的最大天数。
此报告适用于 iReport ,但只要我在 JasperReports服务器中导入此报告,我就会收到此异常。
Error Message
java.lang.IllegalStateException: Processor of type com.jaspersoft.jasperserver.war.cascade.handlers.converters.DataConverter for class
java.util.GregorianCalendar not configured
如何在 JasperReports Server 中解决此问题?如何在 JasperReports Server 中配置此类?
答案 0 :(得分:1)
在研究了上述问题之后,我自己设法解决了这个问题。 我已经研究了JasperServer的数据转换器配置,但没有像Calendar类那样的数据转换器。
我发现最好的方法是创建自定义类,在其中编写要使用Java Calendar类执行的整个逻辑并将其打包到jar中。现在使用jar jar直接解决你的目的。
在我的情况下,我想计算报告期(我生成报告的时间段)。对我来说,这个结果的输入是月份和我生成报告的年份。以下是我编写的代码片段
public static String calculateReportingPeriod(String year, String month,
String dateFormat) {
String reportingPeriod = new String();
Calendar calendar = Calendar.getInstance();
if (year == null || year.isEmpty()) {
Integer lyear = Calendar.getInstance().get(Calendar.YEAR);
year = lyear.toString();
}
if (month == null || month.isEmpty()) {
Integer lmonth = Calendar.getInstance().get(Calendar.MONTH);
/**
* -1 because report in generate for previous month
*/
lmonth = lmonth - 1;
month = lmonth.toString();
} else {
Integer lmonth = Integer.parseInt(month);
lmonth = lmonth - 1;
month = lmonth.toString();
}
if (dateFormat == null || dateFormat.isEmpty()) {
dateFormat = DATE_FORMAT;
}
/**
* calculating max days in the given month and given year
*/
calendar.set(Calendar.YEAR, Integer.parseInt(year));
calendar.set(Calendar.MONTH, Integer.parseInt(month));
Integer maxDays = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Integer.parseInt(year), Integer.parseInt(month),
START_DATE);
Date reportingStartDt = calendar.getTime();
reportingPeriod = new SimpleDateFormat(dateFormat)
.format(reportingStartDt);
reportingPeriod = reportingPeriod.concat(EMPTY_STRING);
reportingPeriod = reportingPeriod.concat(DASH_SEPERATOR);
reportingPeriod = reportingPeriod.concat(EMPTY_STRING);
calendar.set(Calendar.DATE, maxDays);
Date reportingEndDt = calendar.getTime();
reportingPeriod = reportingPeriod.concat(new SimpleDateFormat(
dateFormat).format(reportingEndDt));
return reportingPeriod;
}
然后我在iReports和JasperServer中都使用了这个jar来从输入中获得所需的结果。