Craig, i tried the struts-faces-example with myfaces and RI (worked out of the box)
this happens with myfaces: i clicked LINK "editRegistration.do?action=Create" and become IllegalArgumentException: could not find pathMapping for servletPath = /editRegistration.do requestPathInfo = null net.sourceforge.myfaces.application.jsp.JspViewHandlerImpl.getServletMap ping(JspViewHandlerImpl.java:407) net.sourceforge.myfaces.application.jsp.JspViewHandlerImpl.renderView(Js pViewHandlerImpl.java:185) org.apache.struts.faces.application.ViewHandlerImpl.renderView(ViewHandl erImpl.java:134) net.sourceforge.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.jav a:282) org.apache.struts.faces.application.FacesRequestProcessor.doForward(Face sRequestProcessor.java:148) okay, after that i looked in myfaces JspViewHandlerImpl.java and noticed we only react on FacesServlet-Mappings (eg *.faces, /faces/*,...) i changed it, now it works but as a result of following discussion on myfaces-mailinglist (see the three forwards) i decided to create that wrapper, that sets requestPath from struts (*do) to faces (*.faces) now it works again with myfaces and of course RI so perhaps you have other hints on that? Matthias > -----Original Message----- > From: Craig McClanahan [mailto:[EMAIL PROTECTED] > Sent: Thursday, July 08, 2004 3:27 AM > To: Struts Developers List > Cc: [EMAIL PROTECTED] > Subject: Re: [Struts-Faces] wrapping a HttpServletRequest > > > Matthias Wessendorf wrote: > > >Hi, i tried the faces-struts-lib with RI. > >It works. > > > > > > > Matthias, > > Could you please explain in more detail exactly what appears > to you to > be a bug in the struts-faces library that requires this wrapper, and > also what unspecified behavior in the RI is being relied on? This is > not at all obvious to me -- and I intend to pull the wrapper back out > unless you can show me why it's needed. The explanation > below, and all > the mail threads and messages on bug 29809, still haven't > made it clear > to me what the problems you are trying to solve really are. > > Craig > > > > >But not with Open-Source-Implementation *MyFaces*. > >i notices, that in struts-faces the servletPath is > >a *.do (or that for struts). > > > >But it must be an faces-mapping for servlet-Path > >(*.faces e.g.) > >the FacesRequestProcessor know if request is for > >ActionSerclet or not. > > > >If not, it delegates it to JSF-Impl. > >Base of checking is a URI, that is configed > >in <forward name="success" path="/test.faces"/> (e.g.) > > > >so i wrote a simple HttpServletRequestWrapper > >which wrappes the uri as new ServletPath. > >now everything is fine. > > > >like this (in FacesRequesProcessor) > ><code> > > FacesContextFactory fcf = (FacesContextFactory) > > > >FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); > > > > HttpServletRequestWrapper wrapper = new > >HttpServletRequestWrapper(request,uri); > > > > > > context = > fcf.getFacesContext(servlet.getServletContext(), > >wrapper, > > response, lifecycle); > ></code> > >it is not an error in myfaces-impl. > >it is an bug in the RI. > > > >please see the email of Ted Husted (on myfaces-list) > ><ted> > > > >On Wed, 23 Jun 2004 20:21:49 -0700, > >[EMAIL PROTECTED] wrote: > > > > > >>the MyFaces implementation is correct in this aspect and I > don't think > >> > >> > > > > > > > >>we should clone the bugs of the RI just because struts > relies on them. > >> > >> > > > > > > > >>I hope spec-compliant does not mean we have to have the > same bugs the > >>RI has ;-)? By the way, if the RI is fixed, struts will not > work there > >> > >> > > > > > > > >>any longer, too. > >> > >> > > > >The RI and Struts-Faces were created in tandem, so it's not > surprising > >the same assumptions crop up in each. But, no, > specification-compliant > >does not mean that we should rely on bugs in any implementation, > >including the RI. In fact, the Struts tradition has been to > expose bugs > >in implementations so that vendors are compelled to fix them. > > > >If you develop any patches you would like applied, please > bring them to > >my attention. Once we can get 1.2.1 out-the-door (could be > this week), > >we will be setting up several subprojects, including > Struts-Faces, that > >can be released separately. > > > > > > > >>So the clean solution from my point of view is to fix the issue in > >>struts. For example it would be possible to wrap the > servlet request > >>before the FacesContext is created. The wrapper takes the > uri of the > >>view to be displayed to simulate a valid jsf servlet path > for the view > >> > >> > > > > > > > >>manager. What do you think? > >> > >>Oliver > >> > >> > > > ></ted> > > > > > >and here is the simple wrapper-class: > >i can apply a patch, but on that i will > >do a bit better documentation of that > >wrapper-class > > > > > >Cheers, > >Matthias > > > >/* > > * Copyright 2002,2004 The Apache Software Foundation. > > * > > * Licensed under the Apache License, Version 2.0 (the "License"); > > * you may not use this file except in compliance with the License. > > * You may obtain a copy of the License at > > * > > * http://www.apache.org/licenses/LICENSE-2.0 > > * > > * Unless required by applicable law or agreed to in > writing, software > > * distributed under the License is distributed on an "AS IS" BASIS, > > * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > >implied. > > * See the License for the specific language governing > permissions and > > * limitations under the License. > > */ > >package org.apache.struts.faces.util; > > > >import java.io.BufferedReader; > >import java.io.IOException; > >import java.io.UnsupportedEncodingException; > >import java.security.Principal; > >import java.util.Enumeration; > >import java.util.Locale; > >import java.util.Map; > > > >import javax.servlet.RequestDispatcher; > >import javax.servlet.ServletInputStream; > >import javax.servlet.http.Cookie; > >import javax.servlet.http.HttpServletRequest; > >import javax.servlet.http.HttpSession; > > > >/** > > * <p>Concrete implementation of <code>HttpServletRequest</code> that > > * that wrapps the <code>ServletPath</code> with an URI, that was > >detected > > * by <code>ActionServlet</code> to forward to a standard > ><code>FacesServlet</code>. > > * > > */ > >public class HttpServletRequestWrapper implements > HttpServletRequest { > > > > // ------------------------------------------------------ > >Instance Variables > > > > protected HttpServletRequest original = null; > > protected String servletPath = null; > > > > // ------------------------------------------------------------ > >Constructors > > > > > > /** > > * <p>Construct a new <code>HttpServletRequest</code> instance > > * and an URI, which is used by <code>FacesServlet</code>.</p> > > * > > * @param request Original default > <code>HttpServletRequest</code> > > * > > * @param servletPat the new ServletPath for a > ><code>FacesServlet</code> > > * > > */ > > > > public HttpServletRequestWrapper(HttpServletRequest > request, String > >servletPath){ > > this.original = request; > > this.servletPath = servletPath; > > } > > > > // ---------------------------------------------------------- > >Public Methods > > > > > > /** > > * <p>Returns the new <code>ServletPath</code> needed by a > >FacesServlet.</p> > > * > > */ > > public String getServletPath() { > > // TODO Auto-generated method stub > > return this.servletPath; > > } > > > > // ---------------------------------------------------------- > >Delegate Methods > > > > > > /* (non-Javadoc) > > * @see java.lang.Object#equals(java.lang.Object) > > */ > > public boolean equals(Object arg0) { > > return original.equals(arg0); > > } > > > > ... > >} > > > > > > > > > >--------------------------------------------------------------------- > >To unsubscribe, e-mail: [EMAIL PROTECTED] > >For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]