2012-03-03 14 views
8

Estoy luchando con mi propia implementación de recursos. El getInputStream -metodo no se llama.

Mi manejador:
Own ResourceHandler para transmitir imágenes desde 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); 
    } 

} 

Mi aplicación de recursos:

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

} 

En mi faces-config.xml:

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

En mi JSF:

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

salida en html:

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


Regreso de getRequestPath: /foo/javax.faces.resource/66?ln=media_lib

MediaResource se llama e inicializado, pero el getInputStream no es llamado. FireBug muestra un 404 en esta url (llamado dos veces). Estoy totalmente desconcertado de lo que estoy haciendo mal aquí.

Gracias
Jonny

Respuesta

3

encontró el error .El getRequestPath de mi aplicación rescource fue defectuoso. He olvidado la cara de mapeo (Util.getFacesMapping (contexto)) a las caras en servlet en la 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); 

Todo funciona ahora como se esperaba.

Gracias a BalusC por su ayuda.

Cheers
Jonny

Cuestiones relacionadas