Native ResourceHandler for streaming images from a database

I am struggling with my own implementation of resources. getInputStream method not called.

My handler:

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

My resource implementation:

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

In my faces-config.xml:

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

In my jsf:

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

Output in html:

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


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

MediaResource is called and initialized, but getInputStream is not called. FireBug shows 404 at this URL (twice called). I am completely puzzled by what I am doing wrong here.

thanks
Jonny

+8
jsf-2 mojarra primefaces
source share
1 answer

found a mistake. GetRequestPath error of my implementation for resource recovery. I forgot the face mapping ( Util.getFacesMapping (context) ) with the servlet graph in the 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); 

Everything is working now as expected.

Thanks to BalusC for the help.

Greetings
Jonny

+3
source share

All Articles