2012-03-03 24 views
8

Tôi đang cố gắng thực hiện tài nguyên của riêng mình. Số getInputStream -method không được gọi.

xử lý của tôi:
Tài nguyên riêngHandler để truyền hình ảnh từ DB

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); 
    } 

} 

thực hiện My nguồn:

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; 
    } 

} 

Trong tôi faces-config.xml:

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

Trong JSF của tôi:

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

Output trong html:

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


Return từ getRequestPath: /foo/javax.faces.resource/66?ln=media_lib

MediaResource được gọi và khởi tạo, nhưng getInputStream không được gọi. FireBug hiển thị 404 trên url này (được gọi hai lần). Tôi hoàn toàn bối rối những gì tôi đang làm sai ở đây.

Cảm ơn
Jonny

Trả lời

3

tìm thấy sai lầm .Công getRequestPath thực hiện rescource của tôi đã bị lỗi. Tôi quên faces-mapping (Util.getFacesMapping (context)) với khuôn mặt-servlet trong 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); 

Tất cả mọi thứ công trình bây giờ như mong đợi.

Nhờ BalusC giúp đỡ.

Chúc mừng
Jonny

Các vấn đề liên quan