Hi It is a known problem in JSF 2.0. see:
https://issues.apache.org/jira/browse/MYFACES-2628 http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-893 Theorically there are 2 options: 1. Use MyFaces core 2.1.0-SNAPSHOT. 2. Use prefix mapping for your pages instead suffix mapping. Please close the issue as duplicate. regards, Leonardo Uribe 2011/5/6 Jakob Korherr <[email protected]>: > Hi, > > This seems to be an implementation issue of MyFaces. Please file a > ticket in our JIRA at https://issues.apache.org/jira/browse/MYFACES > > Thanks! > > Regards, > Jakob > > 2011/5/6 Juan Fernandez-Corugedo Igual <[email protected]>: >> >> Hi. >> >> I'm working in a project with Myfaces 2.0.5 and I have had a problem with a >> custom ResourceResolver. >> >> I have coded a ResourceResolver that dynamically builds an XHTML file when >> the engine asks him to resolve a certain URL. >> >> To achieve this, I have update the web.xml as follows: >> >> <context-param> >> <param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name> >> <param-value>*.test;*.xhtml</param-value> >> </context-param> >> >> <context-param> >> <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name> >> >> <param-value>com.test.view.facelets.CustomResourceResolver</param-value> >> </context-param> >> >> My CustomResourceResolver is very simple: >> >> package com.test.view.facelets; >> >> import java.io.ByteArrayInputStream; >> import java.io.IOException; >> import java.io.InputStream; >> import java.net.MalformedURLException; >> import java.net.URL; >> import java.net.URLConnection; >> import java.net.URLStreamHandler; >> >> import javax.faces.view.facelets.ResourceResolver; >> >> public class CustomResourceResolver extends ResourceResolver { >> >> private ResourceResolver innerResourceResolver; >> >> private String viewSource = ".... xhtml of the test page ...."; >> >> public CustomResourceResolver(ResourceResolver resourceResolver){ >> this.innerResourceResolver = resourceResolver; >> } >> >> @Override >> public URL resolveUrl(String path) { >> System.out.println("Buscando la URL del recurso: " + path); >> URL result = null; >> >> if(path.endsWith(".test")){ >> try{ >> result = getUrlForResourceAsStream(path); >> }catch(Exception e){ >> System.out.println("Unexpected error while obtaining the URL >> from resource " + path); >> e.printStackTrace(System.out); >> } >> >> }else{ >> result = this.innerResourceResolver.resolveUrl(path); >> } >> >> return result; >> } >> >> private URL getUrlForResourceAsStream(String path) throws >> MalformedURLException { >> URLStreamHandler handler = new URLStreamHandler() { >> protected URLConnection openConnection(URL u) throws IOException >> { >> final String file = u.getFile(); >> return new URLConnection(u) { >> public void connect() throws IOException { >> } >> >> public InputStream getInputStream() throws IOException { >> System.out.println("Opening internal url to " + >> file); >> >> try{ >> System.out.println("Generando el InputStream de >> la pagina:\n" + viewSource); >> return new >> ByteArrayInputStream(viewSource.getBytes("UTF-8")); >> }catch (Exception e) { >> e.printStackTrace(); >> throw new RuntimeException("Unexpected error >> while obtaining the view", e); >> } >> } >> }; >> } >> }; >> return new URL("internal", null, 0, path, handler); >> } >> } >> >> >> As you can see, the code is very simple. When the suffix matches the pattern >> ".test", the Resolver creates a mock URL with a backing >> ByteArrayInputStream. If the suffix does not matches the pattern, the normal >> ResourceResolver is invoked. >> >> With this configuration and code, when I request the URL: >> http://xxxxxx:yyyy/zzzzz/anything.test the application fails with error: >> >> The problem is this: >> >> java.lang.NullPointerException >> at java.lang.StringBuilder.<init>(StringBuilder.java:92) >> at >> org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.getRenderedViewId(FaceletViewDeclarationLanguage.java:1630) >> at >> org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.buildView(FaceletViewDeclarationLanguage.java:279) >> .... >> >> The executes the viewHandler.createView("xxxx.test") method. It internally >> calls the getViewHandlerSupport().calculateViewId(context, viewId); method >> to obtain the viewId, and this method calls >> DefaultViewHandlerSupport.checkResourceExists(FacesContext context, String >> viewId), that checks the physical file of this resource, but there are not >> any file for this resource!!!! so it return false, and the viewId of the >> resulting ViewRoot is assigned to null. >> >> This causes a NullPointerException later, when the code executes the >> ViewDeclarationLanguage.buildView(FacesContext context, ViewRoot viewRoot). >> >> If I change the Myfaces implementation with Mojarra 2.0.4, it works >> perfectly, so I think that the problem is in the implementation. >> >> I can't extend any class of interface of Myfaces, because my application >> must not be coupled to a specific implementation. >> >> I have attached two web projects, one with Myfaces configuration, that >> fails, and the same project with Mojarra configuration, that works (Both >> without the jars of the implementation) >> >> How can I solve this? >> >> Thanks >> >> > > > > -- > Jakob Korherr > > blog: http://www.jakobk.com > twitter: http://twitter.com/jakobkorherr > work: http://www.irian.at >

