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")
    }
} 

Надеюсь, поможет.

Другие вопросы по тегам