У меня возникла проблема с JasperReports после перекомпиляции шаблона. Вот ситуация:
В 2022 году я создал шаблон PDF с помощью JasperReports Studio (полагаю, это была версия 6.20) и успешно скомпилировал его. Скомпилированный файл .jasper отлично работал с моим существующим проектом Java, в котором используется старый набор библиотек JasperReports (в частности, jasperreports-2.0.4.jar и другие зависимости, перечисленные ниже). Старый шаблон по-прежнему работает нормально – я могу заполнить его и создать PDF-файлы без каких-либо ошибок.
Недавно мне нужно было изменить шаблон. Я использовал ту же версию JasperReports Studio (насколько мне известно, все еще версию 6.20), чтобы открыть и перекомпилировать шаблон без внесения каких-либо изменений. Однако, когда я заменил старый файл .jasper новым скомпилированным в моем проекте, код начал выдавать ошибки (см. скриншот/трассировку стека ниже).
Зависимости моего проекта (в стиле Maven, но с использованием системной области):
localjars1
ireportjars
1.0.1
system
${project.basedir}/lib/commons-digester-1.7.jar
localjars2
ireportjars
1.0.2
system
${project.basedir}/lib/itext-1.2.3.jar
localjars3
ireportjars
1.0.3
system
${project.basedir}/lib/iTextAsian.jar
localjars4
ireportjars
1.0.4
system
${project.basedir}/lib/jasperreports-2.0.4.jar
Версия JDK: 1.8
Ошибка возникает во время выполнения, когда код Java пытается заполнить отчет. Вот трассировка стека (или сообщение об ошибке):
java.lang.NullPointerException: null
at net.sf.jasperreports.engine.JRPropertiesMap.readObject(JRPropertiesMap.java:185)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1185)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2345)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2236)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1692)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2454)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2378)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2236)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1692)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:2142)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1680)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2454)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2378)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2236)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1692)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2454)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2378)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2236)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1692)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:508)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:466)
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:192)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:580)
at org.springblade.common.utils.PrintUtil.GenPDF(PrintUtil.java:186)
at org.springblade.common.utils.PrintUtil.TSGenDownPDF(PrintUtil.java:195)
at org.springblade.modules.tender.controller.TendProjectMaterialController.GenZBBytes(TendProjectMaterialController.java:2877)
at org.springblade.modules.tender.controller.TendProjectMaterialController.GenDownPDFOne(TendProjectMaterialController.java:2676)
at org.springblade.modules.tender.controller.TendProjectMaterialController$$FastClassBySpringCGLIB$$7a88e6a9.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
Что я пробовал:
Я убедился, что использую ту же версию JasperReports Studio, что и раньше (хотя я не уверен на 100 % в номере версии – возможно, это 6.20, но в проекте используются очень старые библиотеки).
Я сравнил старую и новую .jasper и заметил различия (вероятно, из-за разных версий библиотеки JasperReports, используемых во время компиляции). Размер старого файла составляет около [размер] КБ, а нового — [размер] КБ.
Я также подтвердил, что если я верну исходный файл .jasper (скомпилированный в 2022 году), все будет работать отлично. Таким образом, проблема определенно связана с недавно скомпилированной версией.
Дополнительная информация:
Исходный рабочий файл .jasper (тот, который по-прежнему заполняется правильно) доступен здесь:
https://drive.google.com/file/d/1uk-ZiA ... sp=sharing
Я прикрепил старый шаблон JRXML (тот, который работает) для справки. Ниже приведен фрагмент его ключевых свойств (например, языка, размера страницы, операторов импорта) — полный файл доступен [здесь, если я могу предоставить ссылку, или в виде вложения в сообщение, если поддерживается]. В шаблоне используются простые элементы, такие как текстовые поля и статический текст, и не используются какие-либо пользовательские сценарии или сложные выражения. Мой вопрос:
Как я могу перекомпилировать шаблон JRXML, чтобы он оставался совместимым со старой библиотекой jasperreports-2.0.4.jar, используемой в моем проекте? Нужно ли мне настраивать JasperReports Studio для компиляции более старой версии JasperReports или мне следует рассмотреть возможность обновления зависимости JasperReports проекта? Если обновление является единственным решением, какая минимальная совместимая версия будет работать с JDK 8 и моими существующими зависимостями?
Буду очень признателен за любые рекомендации. Спасибо!
У меня возникла проблема с JasperReports после перекомпиляции шаблона. Вот ситуация: [list] [*]В 2022 году я создал шаблон PDF с помощью [b]JasperReports Studio[/b] (полагаю, это была версия 6.20) и успешно скомпилировал его. Скомпилированный файл .jasper отлично работал с моим существующим проектом Java, в котором используется старый набор библиотек JasperReports (в частности, jasperreports-2.0.4.jar и другие зависимости, перечисленные ниже). Старый шаблон по-прежнему работает нормально – я могу заполнить его и создать PDF-файлы без каких-либо ошибок.
[*]Недавно мне нужно было изменить шаблон. Я использовал [b]ту же версию JasperReports Studio[/b] (насколько мне известно, все еще версию 6.20), чтобы открыть и перекомпилировать шаблон [b]без внесения каких-либо изменений[/b]. Однако, когда я заменил старый файл .jasper новым скомпилированным в моем проекте, код начал выдавать ошибки (см. скриншот/трассировку стека ниже).
[*]Зависимости моего проекта (в стиле Maven, но с использованием системной области): [code] localjars1 ireportjars 1.0.1 system ${project.basedir}/lib/commons-digester-1.7.jar
localjars2 ireportjars 1.0.2 system ${project.basedir}/lib/itext-1.2.3.jar
localjars3 ireportjars 1.0.3 system ${project.basedir}/lib/iTextAsian.jar
localjars4 ireportjars 1.0.4 system ${project.basedir}/lib/jasperreports-2.0.4.jar
[/code]
Версия JDK: 1.8
[*]Ошибка возникает во время выполнения, когда код Java пытается заполнить отчет. Вот трассировка стека (или сообщение об ошибке):
[/list]
[code]java.lang.NullPointerException: null at net.sf.jasperreports.engine.JRPropertiesMap.readObject(JRPropertiesMap.java:185) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1185) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2345) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2236) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1692) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2454) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2378) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2236) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1692) at java.io.ObjectInputStream.readArray(ObjectInputStream.java:2142) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1680) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2454) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2378) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2236) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1692) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2454) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2378) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2236) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1692) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:508) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:466) at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:192) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:580) at org.springblade.common.utils.PrintUtil.GenPDF(PrintUtil.java:186) at org.springblade.common.utils.PrintUtil.TSGenDownPDF(PrintUtil.java:195) at org.springblade.modules.tender.controller.TendProjectMaterialController.GenZBBytes(TendProjectMaterialController.java:2877) at org.springblade.modules.tender.controller.TendProjectMaterialController.GenDownPDFOne(TendProjectMaterialController.java:2676) at org.springblade.modules.tender.controller.TendProjectMaterialController$$FastClassBySpringCGLIB$$7a88e6a9.invoke() at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) [/code] [b]Что я пробовал:[/b] [list] [*]Я убедился, что использую ту же версию JasperReports Studio, что и раньше (хотя я не уверен на 100 % в номере версии – возможно, это 6.20, но в проекте используются очень старые библиотеки).
[*]Я сравнил старую и новую .jasper и заметил различия (вероятно, из-за разных версий библиотеки JasperReports, используемых во время компиляции). Размер старого файла составляет около [размер] КБ, а нового — [размер] КБ.
[*]Я также подтвердил, что если я верну исходный файл .jasper (скомпилированный в 2022 году), все будет работать отлично. Таким образом, проблема определенно связана с недавно скомпилированной версией.
[/list] [b]Дополнительная информация:[/b] Исходный рабочий файл .jasper (тот, который по-прежнему заполняется правильно) доступен здесь:
https://drive.google.com/file/d/1uk-ZiAy-DuEvsEV1AxpgM20c2yCKcpSi/view?usp=sharing Я прикрепил старый шаблон JRXML (тот, который работает) для справки. Ниже приведен фрагмент его ключевых свойств (например, языка, размера страницы, операторов импорта) — полный файл доступен [здесь, если я могу предоставить ссылку, или в виде вложения в сообщение, если поддерживается]. В шаблоне используются простые элементы, такие как текстовые поля и статический текст, и не используются какие-либо пользовательские сценарии или сложные выражения. [b]Мой вопрос:[/b]
Как я могу перекомпилировать шаблон JRXML, чтобы он оставался совместимым со старой библиотекой jasperreports-2.0.4.jar, используемой в моем проекте? Нужно ли мне настраивать JasperReports Studio для компиляции более старой версии JasperReports или мне следует рассмотреть возможность обновления зависимости JasperReports проекта? Если обновление является единственным решением, какая минимальная совместимая версия будет работать с JDK 8 и моими существующими зависимостями? Буду очень признателен за любые рекомендации. Спасибо!