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
>

Reply via email to