Grails - Плагин Jasper - Неверный байт 1 из 1-байтовой ошибки последовательности UTF-8 с файлом .jasper - PullRequest
2 голосов
/ 26 ноября 2010

Я использую 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 ]

0 голосов
/ 27 ноября 2010

MalformedByteSequenceException вызвано конфликтом кодировки символов. Я бы предложил везде использовать UTF-8 вместо Windows-1252 (аналогично ISO-8859-1).

В файле файла Jasper * etc / ireport.conf измените default_options на:

default_options="-J-Dfile.encoding=UTF-8 -J-Xms24m -J-Xmx64m"

(Где Xms и Xmx - это не связанные настройки памяти. Если для этой записи конфигурации имеются настройки по умолчанию, вы можете их обогнать, в противном случае просто не указывать их)

См. эту ветку форума для альтернативных конфигураций.

Что касается ошибки с подотчетами, взгляните на обратную косую черту \, что, вероятно, неправильно.

0 голосов
/ 04 ноября 2011

РЕДАКТИРОВАТЬ : Существует некоторая информация о двух проблемах, которые могут помочь в http://grails.org/plugin/jasper#faqTab

, я надеюсь, что смогу помочь с одной из проблем: которая связана с подотчетами 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")
    }
} 

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

0 голосов
/ 27 ноября 2010

Я полагаю, у вас конфликт версий здесь. iReport хранит файлы JRXML и, кажется, автоматически компилирует их в .jasper. Плагин Grails Jasper подхватывает вариант компиляции и попадает в неприятности. Поэтому попробуйте отключить скомпилированный вывод в ireport.

Плагин Grails Jasper 1.1.3 внутренне использует Jasper 3.7.4, используемый ireport - 3.7.6.

Относительно подчиненных отчетов: понятия не имею.

...