2012-03-03 4 views
8

나는 내 자신의 리소스 구현으로 strugging하고있다. getInputStream -method가 호출되지 않습니다.

내 처리기 :
DB에서 이미지를 스트리밍하는 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); 
    } 

} 

내 자원 구현 : 내 얼굴-Config.xml의

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

} 

: 내 JSF에서

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

:

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 구현의 실수 국지적 인 getRequestPath를 결함이있는 것을 발견했다. 나는 URL의 얼굴 - 서블릿 얼굴 매핑 (Util.getFacesMapping (컨텍스트))을 잊었 : 예상대로

@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에게 감사드립니다.

건배
조니