Hi,

we could provide a config parameter that enables this fix also in MyFaces 2.0.x.

WDYT Leo?

Regards,
Jakob

2011/5/6 Leonardo Uribe <[email protected]>:
> 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
>>
>



-- 
Jakob Korherr

blog: http://www.jakobk.com
twitter: http://twitter.com/jakobkorherr
work: http://www.irian.at

Reply via email to