JasperReports with Java Bean:未能呈现图像(InputStream类型的字段)

JasperReports with Java Bean:未能呈现图像(InputStream类型的字段),java,jasper-reports,Java,Jasper Reports,输入: 1.使用成员InputStream初始化 public class Dateien { ... private InputStream payload = null; ... public InputStream getPayload() { return payload; } public void setPayload(InputStream payload) { this.payload = payload; } } 有效负载

输入: 1.使用成员InputStream初始化

public class Dateien {
...
   private InputStream payload = null;
...
   public InputStream getPayload() {
       return payload;
   }
   public void setPayload(InputStream payload) {
     this.payload = payload;
   }
}
  • 有效负载包含图像流(jpg或其他格式)
  • 带有文本字段的Jasper报告(class=java.lang.String,表达式=$F{file.payload})在报告中显示了正确的字符串

    java.io.ByteArrayInputStream@6aa27760
    
  • 但当我在report
    中创建图像字段时(class=java.io.InputStream,expression=$F{file.payload})

  • 我有例外

     SEVERE: Servlet.service() for servlet [appServlet] in context with path [/abc] threw exception [Request processing failed; nested exception is
     net.sf.jasperreports.engine.JRException: Image read failed.] with root cause
     net.sf.jasperreports.engine.JRException: Image read failed.
     at net.sf.jasperreports.engine.util.JRJdk14ImageReader.readImage(JRJdk14ImageReader.java:73)
    
  • 我应该怎么做来解决这个问题


    顺便说一下:我试图通过浏览器中的HTTP获取图像流,我看到了良好的渲染图像。因此,我看到流是正常的,没有损坏。

    在类中引发的异常,在第73行

    JRJdk14ImageReader.readImage(byte[])
    方法的源代码:

    public Image readImage(字节[]字节)引发异常
    {
    InputStream bais=新的ByteArrayInputStream(字节);
    图像=空;
    尝试
    {
    图像=图像读取(BAI);
    }
    捕获(例外e)
    {
    抛出新的异常(e);
    }
    最后
    {
    尝试
    {
    bais.close();
    }
    捕获(IOE异常)
    {
    }
    }
    if(image==null)
    {
    抛出新的JREException(“图像读取失败”);//第73行
    }
    返回图像;
    }
    
    如我们所见,如果映像仍然为空,则会引发异常


    您应该检查是否确实在将字节数组(
    byte[]
    )传递到报告作为有效负载字段。

    在类中引发的异常,在第73行

    JRJdk14ImageReader.readImage(byte[])
    方法的源代码:

    public Image readImage(字节[]字节)引发异常
    {
    InputStream bais=新的ByteArrayInputStream(字节);
    图像=空;
    尝试
    {
    图像=图像读取(BAI);
    }
    捕获(例外e)
    {
    抛出新的异常(e);
    }
    最后
    {
    尝试
    {
    bais.close();
    }
    捕获(IOE异常)
    {
    }
    }
    if(image==null)
    {
    抛出新的JREException(“图像读取失败”);//第73行
    }
    返回图像;
    }
    
    如我们所见,如果映像仍然为空,则会引发异常


    您应该检查是否确实正在将字节数组(
    byte[]
    )作为有效负载字段传递给报表。

    从net.sf.jasperreports.engine.util.JRJdk14ImageReader的源代码可以看出,引发异常的代码是:
    如果(image==null){抛出新的JRException(“image read failed”);}
    @Alex K谢谢。但正如您在我上面的文本(第2页)中看到的,我在流中没有空对象。我有很好的(非空)流对象。如您所见,JRJdk14ImageReader操作
    byte[]
    类型。方法的完整代码是:
    public Image readImage(byte[]bytes)抛出JREException{InputStream bais=new ByteArrayInputStream(bytes);Image=null;try{Image=ImageIO.read(bais);}catch(Exception e){throw new jreException(e);}最后{try{bais.close();}catch(IOException e){}}如果(image==null){抛出新的JREException(“图像读取失败”);}返回图像;}
    您可以调试这一行:
    image=ImageIO.read(bais)@Alex K你帮了我很多!谢谢。从net.sf.jasperreports.engine.util.JRJdk14ImageReader的源代码可以看出,引发异常的代码是:
    if(image==null){throw new JRException(“image read failed”);}
    @Alex K谢谢。但正如您在我上面的文本(第2页)中看到的,我在流中没有空对象。我有很好的(非空)流对象。如您所见,JRJdk14ImageReader操作
    byte[]
    类型。方法的完整代码是:
    public Image readImage(byte[]bytes)抛出JREException{InputStream bais=new ByteArrayInputStream(bytes);Image=null;try{Image=ImageIO.read(bais);}catch(Exception e){throw new jreException(e);}最后{try{bais.close();}catch(IOException e){}}如果(image==null){抛出新的JREException(“图像读取失败”);}返回图像;}
    您可以调试这一行:
    image=ImageIO.read(bais)@Alex K你帮了我很多!谢谢