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
jsf-2 mojarra primefaces
user871611
source share