org.primefaces.model.DefaultStreamedContent无法强制转换为java.lang.String

Ism*_*a90 0 jsf primefaces jsf-2

我试图显示一个存储在MySQL中的BLOB中的图像,OpenJpa用于持久化.我正在使用<p:graphicImage>用户个人资料图片的位置,但打开页面时出错.

这是加载照片的页面代码.

<h:panelGrid columns="2">
      <p:graphicImage value="#{login.getImage()}" alt="/sistema.ciclos.calidad/resources/perfil/default.png"  width="150px" height="150px">
           <f:param name="id" value="#{param.id}" />
      </p:graphicImage>
      <h:panelGrid columns="1">
           <h:outputLabel  id="nombre" value="#{login.usuario.getNombreCompleto()}"></h:outputLabel>
           <h:outputLabel id="cargo" value="#{login.usuario.cargo.cargo}"></h:outputLabel>
           <h:outputLabel  id="correo" value="#{login.usuario.correo}"></h:outputLabel>
      </h:panelGrid>
</h:panelGrid>
Run Code Online (Sandbox Code Playgroud)

这个方法在bean中返回照片.

        @ManagedProperty("#{param.id}")
        private Long id;

        @PostConstruct
        public void init()  {
            ...
            id=usuario.getIdUsuario();
        }

        ...

        public StreamedContent  getImage() {
            byte[] bytes=usuario.getFotoPerfil();
            return new DefaultStreamedContent(new ByteArrayInputStream(bytes));
        }
Run Code Online (Sandbox Code Playgroud)

我正在使用Primefaces 4.0,Jsf 2.0,maven.我试过这篇文章(Post)中的内容,但没有发生

javax.servlet.ServletException: org.primefaces.model.DefaultStreamedContent cannot be cast to java.lang.String
        javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)
        org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:98)
        cl.im.ciclos.service.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:32)
        cl.im.ciclos.service.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:32)
        cl.im.ciclos.service.security.LoginFilter.doFilter(LoginFilter.java:52)
    root cause

    java.lang.ClassCastException: org.primefaces.model.DefaultStreamedContent cannot be cast to java.lang.String
        com.sun.faces.renderkit.RenderKitUtils.getImageSource(RenderKitUtils.java:1282)
        com.sun.faces.renderkit.html_basic.ImageRenderer.encodeEnd(ImageRenderer.java:97)
        javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878)
        com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:295)
        com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
        com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
        javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
        javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613)
        javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
        javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
        com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380)
        com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126)
        javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:273)
        com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127)
        com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
        com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
        javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
        org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:98)
        cl.im.ciclos.service.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:32)
        cl.im.ciclos.service.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:32)
        cl.im.ciclos.service.security.LoginFilter.doFilter(LoginFilter.java:52)
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 6

这条线来自堆栈跟踪

com.sun.faces.renderkit.html_basic.ImageRenderer.encodeEnd(ImageRenderer.java:97)
Run Code Online (Sandbox Code Playgroud)

告诉你,你实际上是在使用<h:graphicImage>,而不是<p:graphicImage>.前者确实不支持DefaultStreamedContent,这完全解释了这个问题.您应该更改<h:graphicImage><p:graphicImage>以便能够使用DefaultStreamedContent.

所以,要么你没有运行你认为正在运行的代码(可能是你编辑h:p:,但不知何故忘记或无法重建/重新部署/重启),或者你正在查看XHTML源代码中的错误位置企图天真的事业.此异常至少不是由您在问题中发布的XHTML源代码中的任何内容引起的.

如果您实际使用<p:graphicImage>,则org.primefaces.component.graphicimage.GraphicImageRenderer该类将出现在堆栈跟踪中的此位置.