2012-03-03 71 views
8

我正在爲自己的資源實施而努力。 getInputStream - 方法不會被調用。

我的處理程序:
擁有ResourceHandler以流式處理來自數據庫的圖像

public class ResourceHandlerWrapperImpl extends 
     ResourceHandlerWrapper { 

    private final ResourceHandler wrapped; 

    public ResourceHandlerWrapper(final ResourceHandler wrapped) 
    { 
    this.wrapped = wrapped; 
    } 

    @Override 
    public ResourceHandler getWrapped() 
    { 
    return wrapped; 
    } 

    @Override 
    public Resource createResource(final String resourceName, final String libraryName) 
    { 
    if (AppConstants.RESOURCE_MEDIA_LIB.equals(libraryName)) 
    { 
     return new MediaResource(resourceName); 
    } 
    else 
    { 
     return super.createResource(resourceName, libraryName); 
    } 
    } 

    /** 
    * @see javax.faces.application.ResourceHandlerWrapper#libraryExists(java.lang.String) 
    */ 
    @Override 
    public boolean libraryExists(final String libraryName) 
    { 
    if (AppConstants.RESOURCE_MEDIA_LIB.equals(libraryName)) 
    { 
     return true; 
    } 
    else 
    { 
     return super.libraryExists(libraryName); 
    } 
    } 

    /** 
    * @see javax.faces.application.ResourceHandlerWrapper#isResourceRequest(javax.faces.context.FacesContext) 
    */ 
    @Override 
    public boolean isResourceRequest(final FacesContext context) 
    { 
    return super.isResourceRequest(context); 
    } 

} 

我的資源實現:

public class MediaResource extends Resource { 

    private final String mediaId; 

    public MediaResource(final String mediaId) { 
     setLibraryName(AppConstants.RESOURCE_MEDIA_LIB); 
     setResourceName(mediaId); 
     setContentType("image/png"); 
     this.mediaId = mediaId; 
    } 

    @Override 
    public InputStream getInputStream() throws IOException { 
     if (mediaId != null) { 
      System.out.println("Yeahhh!!!"); 
     } 

     return null; 
    } 

    @Override 
    public Map<String, String> getResponseHeaders() { 
     return new HashMap<String, String>(); 
    } 

    @Override 
    public String getRequestPath() { 
     final FacesContext context = FacesContext.getCurrentInstance(); 
     return context 
       .getApplication() 
       .getViewHandler() 
       .getResourceURL(
         context, 
         ResourceHandler.RESOURCE_IDENTIFIER + "/" + mediaId 
           + "?ln=" + AppConstants.RESOURCE_MEDIA_LIB); 
    } 

    @Override 
    public URL getURL() { 
     return null; 
    } 

    @Override 
    public boolean userAgentNeedsUpdate(final FacesContext context) { 
     return true; 
    } 

} 

在我faces-config.xml中:

<application> 
    <resource-handler>com.foo.bbb.ResourceHandlerWrapperImpl</resource-handler> 
</application> 

在我的JSF:

<h:graphicImage library="media_lib" name="66" width="50" /> 

輸出HTML中:從getRequestPath

<img src="/foo/javax.faces.resource/66?ln=media_lib" width="50" /> 


返回:/foo/javax.faces.resource/66?ln=media_lib

MediaResource被稱爲和初始化的,但是的getInputStream不叫。 FireBug在這個URL上顯示一個404(稱爲兩次)。 我完全迷惑我在這裏做錯了。

謝謝
強尼

回答

3

發現我rescource執行錯誤.The getRequestPath是錯誤的。我忘了臉映射(Util.getFacesMapping(上下文))到faces-的servlet的URL:現在

@Override 
    public String getRequestPath() { 
     final FacesContext context = FacesContext.getCurrentInstance(); 
     return context 
       .getApplication() 
       .getViewHandler() 
       .getResourceURL(
         context, 
         ResourceHandler.RESOURCE_IDENTIFIER + "/" + mediaId + Util.getFacesMapping(context) 
           + "?ln=" + AppConstants.RESOURCE_MEDIA_LIB); 

一切正常。

感謝BalusC的幫助。

Cheers
Jonny