Java p:graphicImage流内容空指针

Java p:graphicImage流内容空指针,java,jsf,tomcat,primefaces,Java,Jsf,Tomcat,Primefaces,尝试获取一个blob并将其转换为流式内容。我得到字节,它们被转换成ByteArrayInputStream,我返回StreedContent图像,但我一直得到这个: SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/ConfigEmployee] threw exception java.io.IOException: java.lang.NullPointerExceptio

尝试获取一个blob并将其转换为流式内容。我得到字节,它们被转换成ByteArrayInputStream,我返回StreedContent图像,但我一直得到这个:

    SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/ConfigEmployee] threw exception
    java.io.IOException: java.lang.NullPointerException
Caused by: java.lang.NullPointerException
    at org.primefaces.application.resource.StreamedContentHandler.handle(StreamedContentHandler.java:56)
    ... 21 more
第56行有以下内容:
externalContext.setResponseContentType(streamedContent.getContentType())

我需要补充的是,每个图像对象返回两次流式内容

图像bean:

public Image(byte[] bytes,String name)
    {
        this.id=new MyDatabase().getLastId("image")+1;
        this.name=name;
        this.byteData=bytes;

        InputStream is=new ByteArrayInputStream(bytes);
        this.image = new DefaultStreamedContent(is,"image/png");

    }
public StreamedContent getImage() 
    {
        return image;
    }
HTML代码

<div class="dataTable">
            <h:form id="imageList">
                <p:dataTable var="img" value="#{imageView.images}" rowKey="#{img.id}" rows="10" lazy="true" paginator="true">
                    <p:column headerText="Image">
                        <p:graphicImage style="width:80px; height:80px" value="#{img.image}" />
                    </p:column>
                    <p:column width="200" headerText="Name">
                        <h:outputText value="#{img.name}" />
                    </p:column>
                    <p:column width="200" headerText="Edit">
                        <h:commandButton value="Enter" actionListener="#{imageView.convertImage(img)}" action="Image?faces-redirect=true" />
                    </p:column>
                </p:dataTable>


            </h:form>
        </div>

惰性负载

@Override
    public List<Image> load(int first, int pageSize, String sortField, SortOrder sortOrder,
            Map<String, Object> filters)
    {
        db.openDatabase();
        ResultSet rs = db.getImage();

        List<Image> imgList = new ArrayList<Image>();

        try
        {
            if (rs.last())
                this.setRowCount(rs.getRow());

            for (rs.absolute(first); rs.next() && first <= (first + pageSize); first++)
            {
                imgList.add(new Image(rs.getBytes("byteData"), rs.getString("name")));

            }
        }
        catch (SQLException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally
        {
            db.closeDatabase();
        }
        return imgList;
    }
@覆盖
公共列表加载(int first,int pageSize,String sortField,SortOrder SortOrder,
地图过滤器)
{
openDatabase();
ResultSet rs=db.getImage();
List imgList=new ArrayList();
尝试
{
如果(rs.last())
this.setRowCount(rs.getRow());

对于(绝对值(第一个);绝对值下一个()&&firstbean的作用域是什么,它应该是视图或会话作用域,您必须更改访问bean的方式。对于动态创建的图像,将发送两个请求。一个用于呈现HTML,呈现
img
标记。第二个则基于src属性触发。模型必须保留该值s接受后续请求


这里解释得很好

谢谢,我以前确实发现了这个,但由于我认为它过时的日期。我想问一下
StudentService
类,它是做什么的?StudentService是一个示例类,这个概念很重要。示例中的bean标记为应用范围,因此仅存在一个实例。如果将ImageBean标记为应用程序范围,则可以解决问题,但如果两个用户访问您的页面,他们都会看到相同的图像,因为该图像将加载一次,而不是每个请求加载一次。因此,在p:graphicImage中添加了一个唯一的参数(您也有id参数),参数从请求上下文的getImage中获取。这样,bean会持久化accross请求,并为每个请求提供图像。在我给出的html代码中,它会显示一个空白方块或图像图标(没有图像时得到的图标).但是,由于我有很多图像,您可以通过单击按钮进行选择,它会将图像发送到另一个页面,但如果我想返回并选择另一个图像,当页面重定向时,它仍会显示旧图像,因此我需要刷新页面以显示新图像。这就像页面加载速度比生成图像的速度快一样艾德,但我想这是另一个问题。