Grails - Плагин Jasper - Неверный байт 1 из 1-байтовой ошибки последовательности UTF-8 с файлом.jasper
Я использую Grails 1.3.5, SQL Server 2005, iReports 3.7.6, плагин Jasper 1.1.3. На моей странице GSP я дал тег jasperReprt как:
<g:jasperReport jasper="report1" format="PDF">
<input type="hidden" name="test_id" id="test_id"/>
<input type="hidden" name="order_no" id="order_no" />
</g:jasperReport>
Для разработки, в Config.groovy я указал
jasper.dir.reports = './reports'
При создании и сохранении нового отчета в папке отчетов создаются два файла, а именно report.jrxml и report.jasper.
При щелчке по значку PDF в IE или Firefox выдается ошибка сервера 500 и ниже - трассировка стека.
[2010-11-27 01:13:14.998] ERROR groovy.grails.web.errors.GrailsExceptionResolver Invalid byte 1 of 1-byte UTF-8 sequence.
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:684)
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:554)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742)
at
Но если я удалю report1.jasper
ошибка больше не генерируется, если щелкнуть значок PDF и отчет в формате PDF отображается нормально.
Это правильный способ сделать это?
Моя вторая проблема связана с использованием подотчетов. Подотчет находится в той же папке, что и основной отчет. Но когда отчет выполняется из приложения, ниже выдается ошибка:
[2010-11-27 01:30:27.556] ERROR groovy.grails.web.errors.GrailsExceptionResolver Could not load object from location : ./reports\report1sub_report.jasper net.sf.jasperreports.engine.JRException: Could not load object from location : ./reports\urine_routinepatient_details_sub_report.jasper at net.sf.jasperreports.engine.util.JRLoader.loadObjectFromLocation(JRLoader.java:262) at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateReport(JRFillSubreport.java:301) at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateSubreport(JRFillSubreport.java:327)
Не находит подотчет. Как я могу это исправить?
Спасибо. Джей Чандран.
Редактировать: я искал все это время, но все еще не мог найти правильное решение. Поэтому я сделал несколько проб и ошибок. Я понял это, удалив report1.jasper
и просто ухожу jasper.jrxml
в каталоге отчетов работает просто отлично, как я уже говорил ранее.
Для вопроса подотчета: он выдавал ошибку Could not load object from location : ./reports\report1sub_report.jasper
По какой-то странной причине главное название отчета report
добавлялся к имени sub_report.jasper
и искал файл с именем report1sub_report.jasper
Итак, я создал подпапку под reports
папка и назвал его report1
и обновленный файл report1.jrxml
<subreportExpression class="java.lang.String"><![CDATA[$P{SUBREPORT_DIR} + "\\sub_report.jasper"]]></subreportExpression>
Я должен был добавить дополнительные \\
косая черта, хотя параметр "SUBREPORT_DIR" имел \\
косые черты в конце пути, как показано ниже.
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
<defaultValueExpression><![CDATA["F:\\Workspace\\SpringSource2.5.0\\GrailsProjec\\reports\\report1\\"]]></defaultValueExpression>
</parameter>
Обратите внимание на \\
в конце. Я не знаю, почему это не было добавлено!
Другим способом было бы просто изменить название подотчета с sub_report.jasper
в report1sub_report.jasper
!!!:)
Я проверил это в производственном режиме, и он отлично работает. Я не уверен, если это способ сделать это, но все другие возможные решения не сработали для меня.
Обратная связь будет очень полезна.
3 ответа
Я предполагаю, что у вас есть конфликт версий здесь. iReport хранит файлы JRXML и, кажется, автоматически компилирует их в.jasper. Плагин Grails Jasper подхватывает вариант компиляции и попадает в неприятности. Поэтому попробуйте отключить скомпилированный вывод в ireport.
Плагин Grails Jasper 1.1.3 внутренне использует Jasper 3.7.4, используемый ireport - 3.7.6.
Относительно отчетов: не знаю.
MalformedByteSequenceException
вызвано конфликтом кодировки символов. Я бы предложил везде использовать UTF-8 вместо Windows-1252 (аналогично ISO-8859-1).
В файле etc/ireport.conf Джаспера измените default_options
чтобы:
default_options="-J-Dfile.encoding=UTF-8 -J-Xms24m -J-Xmx64m"
(Куда Xms
а также Xmx
несвязанные настройки памяти. Если с этой конфигурационной записью есть настройки по умолчанию, вы можете их обогнать, иначе просто пропустите.)
Смотрите эту ветку форума для альтернативных конфигураций.
Что касается ошибки с подотчетами, взгляните на обратную косую черту \
это, вероятно, неправильно.
РЕДАКТИРОВАТЬ: Существует некоторая информация о двух проблемах, которые могут помочь в http://grails.org/plugin/jasper
Я надеюсь, что смогу помочь с одним из вопросов: который связан с подотчетами dir. Проблема заключается в том, что код плагина устанавливает для SUBREPORT_DIR полный путь к файлу основного отчета, включая его имя. Тем не менее, код соблюдает предоставленный пользователем параметр с тем же именем, поэтому, если вы заполните этот параметр любым значением, кроме null, плагин будет его использовать.
Например, если вы напрямую связываете контроллер jasper, вы можете сделать:
def renderAs(data,format) {
def reportParams=params.clone()
reportParams["_format"]=reportParams["_format"]?:"${format.toUpperCase()}"
reportParams["SUBREPORT_DIR"]=CH.config.jasper.dir.reports+"/"
chain(controller:'jasper',action:'index',model:[data:[]+data],params:reportParams)
}
В вашем сценарии (некрасиво) можно создать скрытый вход с именем SUBREPORT_DIR и указать желаемый. Я бы заполнил пареметр другим способом.
РЕДАКТИРОВАТЬ: Другая раздражающая проблема заключается в том, где мы должны поместить основные отчеты и скомпилированные подотчеты:
- Когда вы запускаете приложение с помощью run-app, они работают, если вы поместите их все в папку с тем же именем, что и CH.config.jasper.dir.reports(reportDir) в корне приложения grails.
- Но если вы хотите развернуть войну, вы должны поместить основные отчеты в папку reportDir в корне файла войны и скомпилированные подотчеты в WEB-INF/classes/reportDir.
Я решил сохранить все файлы в grailsApp/reports и скопировать ресурсы в соответствующие папки в задаче war grails. В мой BuildConfig.groovy я добавил (reportDir это "отчеты"):
grails.war.resources = { stagingDir,args ->
def classpathDir="${stagingDir}/WEB-INF/classes"
copy(toDir:"${stagingDir}/reports") {
fileset(dir:"reports",includes:"**")
}
copy(toDir:"${classpathDir}/reports") {
fileset(dir:"reports",excludes:"**.jrxml")
}
}
Надеюсь, поможет.