2010-11-26 98 views
2

我正在使用Grails 1.3.5,SQL Server 2005,iReports 3.7.6,Jasper Plugin 1.1.3。在我的GSP頁我已經給jasperReprt標籤爲:Grails - Jasper Plugin - 使用.jasper文件的1字節UTF-8序列錯誤的無效字節1

<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。

單擊IE或Firefox中的PDF圖標時,會引發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)

它沒有找到子報告。我該如何解決它?

謝謝。 Jay Chandran。

編輯: 我一直在尋找整個過程,但仍然找不到合適的解決方案。所以我做了一些試驗和錯誤。我發現,刪除report1.jasper,並且在報告目錄中僅僅留下jasper.jrxml就可以正常工作,就像我之前所說的那樣。

對於子報告的問題:它是給錯誤Could not load object from location : ./reports\report1sub_report.jasper一些奇怪的原因,主要報告名稱report漸漸追加到名稱sub_report.jasper並正在尋找一個名爲report1sub_report.jasper

文件,所以我創建了一個子reports文件夾下-folder並把它命名report1和更新report1.jrxml文件

<subreportExpression class="java.lang.String"><![CDATA[$P{SUBREPORT_DIR} + "\\sub_report.jasper"]]></subreportExpression> 

我不得不添加即使「SUBREPORT_DIR」參數有額外\\斜槓如下所示,在路徑的末尾加上210個斜槓。

<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 !!! :)

我已經測試了這種生產模式,它工作正常。我不確定這是否是這樣做的,但所有其他可能的解決方案都不適合我。

反饋將非常有幫助。

+0

感謝您解決字符編碼問題的解決方法,我仍在調查它適當的解決方案 – jneira 2011-11-04 13:58:20

+0

我已選擇將編譯.jasper的目錄更改爲c \ windows \ temp以避免手動刪除文件。 – jneira 2011-11-04 14:04:36

回答

0

我假設你在這裏有版本衝突。 iReport存儲JRXML文件,似乎將它們自動編譯爲.jasper。 Grails Jasper插件提取了編譯變體,並且遇到了麻煩。所以嘗試禁用ireport中的編譯輸出。

Grails Jasper插件1.1.3在內部使用Jasper 3.7.4,使用的ireport是3.7.6。

關於子報告:不知道。

+0

感謝您的回覆。我更新了我的問題。使用我更新的問題中提到的解決方法,事情開始爲我工作。但不知道這是否是最好的方式。 – 2010-11-27 18:25:07

0

MalformedByteSequenceException是由字符編碼衝突引起的。我建議在任何地方都使用UTF-8而不是Windows的Win-1252(類似於ISO-8859-1)。

在Jasper的等/ ireport.conf文件,更改default_options到:

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

(其中XmsXmx無關內存設置如果有與配置項的默認設置,你可以超車他們,否則,只是將它們排除在外)。

請參閱this forum thread瞭解替代配置。

至於subreports的錯誤,看看反斜槓\這可能是錯誤的。

0

編輯:有兩個問題的一些信息這可能會在 http://grails.org/plugin/jasper#faqTab

幫我希望我可以用的問題之一幫助:哪一個與子報表目錄有關。 問題是插件代碼將SUBREPORT_DIR設置爲主報告的完整文件路徑,包括其名稱。但是,代碼向用戶提供了具有相同名稱的param,所以如果您將此參數填充爲除null之外的任何值,則該插件將使用它。

例如,如果你直接連鎖碧玉控制器,你可以這樣做:

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和值所需的一個隱藏的輸入。我會以其他方式填寫數據。

編輯: 另一個惱人的問題出在哪裏做,我們必須把主報告和編譯子報表:

  • 當您運行與運行應用程序的應用程序,他們的工作,如果你把他們都在一個文件夾與Grails應用程序根目錄中的CH.config.jasper.dir.reports(reportDir)具有相同的名稱。
  • 但是如果你想部署一場戰爭,你必須把主要報告放在war-編譯後的子報告的根目錄下的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") 
    } 
} 

希望它能幫助。

相關問題