Джаспер: ошибка при открытии потока ввода с URL - PullRequest
3 голосов
/ 01 декабря 2011

Я создаю отчет jasper, используя iReport, который принимает параметр и получает изображение с заданного URL-адреса:

Параметр - это экранное имя пользователя в Twitter, а URL-адрес - это изображение профиля.

    <image>
       <reportElement x="4" y="51" width="73" height="64"/>
           <imageExpression><![CDATA["https://api.twitter.com/1/users/profile_image?screen_name="+$F{user_screen_name}+"&size=bigger"]]></imageExpression>
    </image>

Отлично работает, когда изображение существует.Если это не так, выдается следующее исключение:

    Error filling print... net.sf.jasperreports.engine.JRException: Error opening input stream from URL :
    https://api.twitter.com/1/users/profile_image?screen_name=CPTCurtisHervey&size=bigger 
    Setting up the file resolver... net.sf.jasperreports.engine.JRRuntimeException:
    net.sf.jasperreports.engine.JRException: Error opening input stream from URL :
    https://api.twitter.com/1/users/profile_image?screen_name=CPTCurtisHervey&size=bigger 
    at net.sf.jasperreports.repo.DefaultRepositoryService.getInputStream(DefaultRepositoryService.java:138)
    at net.sf.jasperreports.repo.RepositoryUtil.findInputStream(RepositoryUtil.java:186)     
    at net.sf.jasperreports.repo.RepositoryUtil.getBytes(RepositoryUtil.java:202)
    at net.sf.jasperreports.engine.JRImageRenderer.getInstance(JRImageRenderer.java:141)     
    at net.sf.jasperreports.engine.fill.JRFillImage.evaluateImage(JRFillImage.java:498)
    at net.sf.jasperreports.engine.fill.JRFillImage.evaluate(JRFillImage.java:441)
    at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:257)
    at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:468)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2037)     
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:761)     
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportContent(JRVerticalFiller.java:291)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:133)     
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:903)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:813)
    at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:58)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:417)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:247)
    at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:878)
    at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572)
    at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997) Caused by: 
    net.sf.jasperreports.engine.JRException: Error opening input stream from URL : 
    https://api.twitter.com/1/users/profile_image?screen_name=CPTCurtisHervey&size=bigger     
    at net.sf.jasperreports.engine.util.JRLoader.getInputStream(JRLoader.java:314)
    at net.sf.jasperreports.repo.DefaultRepositoryService.getInputStream(DefaultRepositoryService.java:121)
    ... 19 more Caused by: java.io.FileNotFoundException: 
    https://api.twitter.com/1/users/profile_image?screen_name=CPTCurtisHervey&size=bigger     
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1401)     
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at java.net.URL.openStream(URL.java:1029)     
    at net.sf.jasperreports.engine.util.JRLoader.getInputStream(JRLoader.java:310)... 20 more 
    Print not filled. Try to use an EmptyDataSource...

Как мне справиться с этой ситуацией в файле jrxml?

Я хотел бы просто добавить фиксированный URL-адрес, еслине могу найти.

У кого-нибудь есть предложения?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 02 декабря 2011

Я думаю, вам нужно добавить дополнительный вспомогательный класс, чтобы справиться с этим. Вам нужен статический метод boolean urlExists(String url), который бы позволил вам поместить это в выражение imageExpression:

MyClass.urlExists($F{image_url}) ? $F{image_url} : $P{fallback_image}

Это был бы простой класс для написания ... но очевидно, что есть дополнительная сложность при добавлении в другой файл .jar. Без этого метода я не вижу способа выполнить обработку в .jrxml.

0 голосов
/ 03 июня 2013

В моем случае у меня был отчет, в который я «вставлял» URL-адрес изображения, и это приводило к ошибке с сертификатом (у URL, который я «вводил», был IP-адрес, и это должно было быть имя для сертификата) , После того, как я изменил URL, он заработал.

0 голосов
/ 05 января 2012

в файле jrxml, чтобы показать изображение из ресурса URL, используйте выражение изображения URL()

как показано ниже, например $F{ADPN_NO} - это параметр из отчета

<imageExpression><![CDATA[new URL("http://anyserver:7001/images/"+$F{ADPN_NO}+".jpg")]]></imageExpression>

при возникновении onError будет отображаться пустой элемент, значок или ошибка, установленная в jrxml.

с другой стороны, вне jrxml-файла вы можете использовать объект карты java, содержащий img-URL, который проверяется URL() или File() Exception ..

...