• Startseite
  • Über mich
  • Portfolio
    • Eventmanagement
    • Technologie
      • Multitouch-Surface
      • Multitouch-Table
    • Smartphone-Apps
    • Unternehmen
    • Presse
  • Programmierung
  • Auto
  • Wirtschaftsinformatik

Patrick Hütter

Mein Blog rund um Softwareentwicklung, Online-Marketing, StartUps, Gründung, Unternehmertum, Trends and more

How to get grails rendering and grails-melody (java melody) working together

1
  • by Patrick Hütter
  • in Code-Snippets · Programmierung
  • — 7 Jul, 2013

I’m using grails rendering 0.4.4 plugin to render some HTML(GSP) to PDF wich uses the underlying iText library in version 2.1.0.

I also wanted to monitor my webapplication with java melody, so i decided to install grails-melody. This plugin comes with pdf-export for the java melody reports and uses also the iText library, but in the newer version 2.1.7.

Normally this shouldn’t be a problem, because you can exclude the older or newer library in the dependencies of your grails application, but in this case there is a binary incompatibility between the different Flying Saucer binaries. So you get the following exception:

java.lang.NoSuchMethodError – com.lowagie.text.pdf.BaseFont.getCharBBox(C)….

Line | Method
->> 195 | doFilter in PageFragmentCachingFilter.java
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|    63 | doFilter in AbstractFilter.java
|   151 | invoke . in net.bull.javamelody.JspWrapper
|   271 | invoke   in net.bull.javamelody.JdbcWrapper$DelegatingInvocationHandler
|   206 | doFilter in net.bull.javamelody.MonitoringFilter
|   179 | doFilter in     ''
|   895 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   918 | run      in     ''
^   680 | run . .  in java.lang.Thread

Caused by ControllerExecutionException: Runtime error executing action
->> 195 | doFilter in PageFragmentCachingFilter.java
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|    63 | doFilter in AbstractFilter.java
|   151 | invoke . in net.bull.javamelody.JspWrapper
|   271 | invoke   in net.bull.javamelody.JdbcWrapper$DelegatingInvocationHandler
|   206 | doFilter in net.bull.javamelody.MonitoringFilter
|   179 | doFilter in     ''
|   895 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   918 | run      in     ''
^   680 | run . .  in java.lang.Thread

Caused by InvocationTargetException: null
->> 195 | doFilter in PageFragmentCachingFilter.java
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|    63 | doFilter in AbstractFilter.java
|   151 | invoke . in net.bull.javamelody.JspWrapper
|   271 | invoke   in net.bull.javamelody.JdbcWrapper$DelegatingInvocationHandler
|   206 | doFilter in net.bull.javamelody.MonitoringFilter
|   179 | doFilter in     ''
|   895 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   918 | run      in     ''
^   680 | run . .  in java.lang.Thread

Caused by NoSuchMethodError: com.lowagie.text.pdf.BaseFont.getCharBBox(C)[I
->> 679 | setMetricDefaults in org.xhtmlrenderer.pdf.ITextFontResolver$FontDescription
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|   610 |    in     ''
|   410 | addCourier in org.xhtmlrenderer.pdf.ITextFontResolver
|   390 | createInitialFontMap in     ''
|    52 |  . in     ''
|   115 |    in org.xhtmlrenderer.pdf.ITextRenderer
|   102 |  . in     ''
|    34 | doRender in PdfRenderingService.groovy
|    43 | render . in RenderingService.groovy
|    37 | render   in     ''
|    35 | render . in     ''
|    65 | render   in     ''
|   165 | doCall . in GrailsMelodyGrailsPlugin$_closure4_closure15_closure16
|    59 | doCall   in RenderingGrailsPlugin$_closure3
|   366 | getTickets in ShopController.groovy
|   195 | doFilter in PageFragmentCachingFilter.java
|    63 | doFilter in AbstractFilter.java
|   151 | invoke   in net.bull.javamelody.JspWrapper
|   271 | invoke . in net.bull.javamelody.JdbcWrapper$DelegatingInvocationHandler
|   206 | doFilter in net.bull.javamelody.MonitoringFilter
|   179 | doFilter in     ''
|   895 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   918 | run . .  in     ''
^   680 | run      in java.lang.Thread

To fix this you have to recompile Flying Saucer R8 against iText 2.1.x and it will work fine. But you don’t have to do it yet, because you can use the library from here. Just place it in your „lib“ folder as „core-renderer-R8.jar“ in your grails project and edit your dependencies.

BuildConfig.groovy:

dependencies {
 // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes eg.
 runtime ( 'org.xhtmlrenderer:core-renderer:R8', 'com.lowagie:itext:2.1.7')
 }

plugins {
runtime(':rendering:0.4.4') { exclude 'itext' }
compile ":grails-melody:1.45"
}

Now everything works as expected with the newest iText version (old license tree). I’m able to use the rendering plugin to generate pdf exports and java melody to get application reports.javamelody-grails

Share

Tags: exportGrailsjava melodymonitoringpdfrendering

— Patrick Hütter

Patrick ist Gründer und Geschäftsführer der encircle360 GmbH. Er liebt Technologie und kennt sich sehr gut im Bereich Softwareentwicklung, u.a. auf JVM basierten Technologien wie Spring Boot, VertX, Akka, Groovy, Scala & Elasticsearch aus.

1 Comment

  1. Jan Keller sagt:
    17. Oktober 2013 um 8:41 Uhr

    Hi,
    I tried your solution, but it doesn’t work for me. It seems like it doesn’t found some classes from the core-renderer. I have no experiences with grails dependencies, so I can’t figure out how to solve this problem. Could you please direct me in right direction? My stack trace follows:

    | Error 2013-10-17 09:23:53,435 [http-bio-8090-exec-4] ERROR datauri.DataUriAwareITextUserAgent – exception creating image from data uri (will use empty image): grails.plugin.rendering.datauri.DataUri@6beaaf10
    Message: Could not find matching constructor for: org.xhtmlrenderer.resource.ImageResource(org.xhtmlrenderer.pdf.ITextFSImage)
    Line | Method
    ->> 50 | getImageResource in grails.plugin.rendering.datauri.DataUriAwareITextUserAgent
    – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
    | 57 | createReplacedElement in org.xhtmlrenderer.pdf.ITextReplacedElementFactory
    | 1437 | calcMinMaxWidth . . . . . . . in org.xhtmlrenderer.render.BlockBox
    | 1582 | calcMinMaxWidthInlineChildren in “
    | 1479 | calcMinMaxWidth . . . . . . . in “
    | 1357 | calcShrinkToFitWidth in “
    | 869 | calcShrinkToFitWidthIfNeeded in “
    | 766 | layout in “
    | 732 | layout . . . . . . . . . . . in “
    | 79 | layoutFloated in org.xhtmlrenderer.layout.LayoutUtil
    | 848 | processOutOfFlowContent . . . in org.xhtmlrenderer.layout.InlineBoxing
    | 287 | layoutContent in “
    | 939 | layoutInlineChildren . . . . in org.xhtmlrenderer.render.BlockBox
    | 47 | layout in org.xhtmlrenderer.render.AnonymousBlockBox
    | 301 | layoutBlockChild0 . . . . . . in org.xhtmlrenderer.layout.BlockBoxing
    | 279 | layoutBlockChild in “
    | 89 | layoutContent . . . . . . . . in “
    | 923 | layoutChildren in org.xhtmlrenderer.render.BlockBox
    | 803 | layout . . . . . . . . . . . in “
    | 732 | layout in “
    | 301 | layoutBlockChild0 . . . . . . in org.xhtmlrenderer.layout.BlockBoxing
    | 279 | layoutBlockChild in “
    | 89 | layoutContent . . . . . . . . in “
    | 923 | layoutChildren in org.xhtmlrenderer.render.BlockBox
    | 803 | layout . . . . . . . . . . . in “
    | 732 | layout in “
    | 301 | layoutBlockChild0 . . . . . . in org.xhtmlrenderer.layout.BlockBoxing
    | 279 | layoutBlockChild in “
    | 89 | layoutContent . . . . . . . . in “
    | 923 | layoutChildren in org.xhtmlrenderer.render.BlockBox
    | 803 | layout . . . . . . . . . . . in “
    | 732 | layout in “
    | 213 | layout . . . . . . . . . . . in org.xhtmlrenderer.pdf.ITextRenderer
    | 37 | doRender in grails.plugin.rendering.pdf.PdfRenderingService
    | 43 | render . . . . . . . . . . . in grails.plugin.rendering.RenderingService
    | 37 | render in “
    | 35 | render . . . . . . . . . . . in “
    | 65 | render in “
    | 184 | doCall . . . . . . . . . . . in GrailsMelodyGrailsPlugin$_closure4_closure16_closure17
    | 59 | doCall in RenderingGrailsPlugin$_closure3
    | 287 | getReport . . . . . . . . . . in cz.eyedea.MatchesController
    | 195 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
    | 63 | doFilter . . . . . . . . . . in grails.plugin.cache.web.filter.AbstractFilter
    | 151 | invoke in net.bull.javamelody.JspWrapper
    | 277 | invoke . . . . . . . . . . . in net.bull.javamelody.JdbcWrapper$DelegatingInvocationHandler
    | 208 | doFilter in net.bull.javamelody.MonitoringFilter
    | 181 | doFilter . . . . . . . . . . in “
    | 1146 | runWorker in java.util.concurrent.ThreadPoolExecutor
    | 615 | run . . . . . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
    ^ 679 | run in java.lang.Thread

    Antworten

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

  • Previous story Facebook bald mit eigenem Online-Ticketing für Events?
  • Next story Expert-Day & SEO-DAY 2013 – Ein kurzer Recap und Download des KeywordPlanner Scraper Prototypen
  • Du suchst richtig gute Beratung im Bereich Software & IT?

    encircle360
  • Neueste Beiträge

    • Running headscale with headscale-admin (UI), letsencrypt & docker-compose in dual stack with IPv4 and IPv6
    • Groovy & Grails suchen einen neuen Hauptsponsor
    • Unitymedia DNS Probleme und Lösungsmöglichkeiten für Mac OS X, Windows und den eigenen Router
    • Running Grails applications on the Raspberry Pi
    • [HowTo] Build groovy project and package as jar (with all dependencies) for easy distribution with gradle
  • Neueste Kommentare

    • nototok bei Running headscale with headscale-admin (UI), letsencrypt & docker-compose in dual stack with IPv4 and IPv6
    • Muiz bei Running headscale with headscale-admin (UI), letsencrypt & docker-compose in dual stack with IPv4 and IPv6
    • John Tucker bei Running headscale with headscale-admin (UI), letsencrypt & docker-compose in dual stack with IPv4 and IPv6
    • Bastlerwastl bei HowTo: Squid Proxy Server unter Debian schnell eingerichtet
    • PatrickHuetter bei So geht’s: Macbook mit zwei externen Monitoren verbinden
  • Kategorien

    • Allgemein
    • Android
    • Code-Snippets
    • Datenbanken
    • Elektrotechnik
    • Licht
    • Linux
    • Mac
    • Messe
    • Online-Marketing
    • Programmierung
    • Projektmanagement
    • SEM
    • SEO
    • Server
    • Shell
    • Social Media
    • Web
  • Weiterführende Links

    • Price API
    • encircle360
    • sellytics
  • Impressum
  • Datenschutz

© Patrick Hütter