tomee-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Karan Malhi" <karan.ma...@gmail.com>
Subject Re: Tomcat webapp Configuration
Date Wed, 07 May 2008 14:14:35 GMT
Great,

We will try to add a permanent fix in OpenEJB.

On 5/7/08, JimOR <jimorourke@clearviewcatv.net> wrote:
>
>
> Works like a charm,  Thanks for all your help!!
>
>
>
> KMalhi wrote:
> >
> > Jim/David,
> >
> > Sorry about sending the previous messages to users list. Should've sent
> > them
> > to the dev list.
> >
> > Jim:
> >
> > I have created a temporary fix to the issue right now. Here is what you
> > would need to do
> >
> > 1. Create a servlet class named StarterServlet and register it in
> web.xml.
> > Give it a load-on-startup value of 10 . Below is the code for the
> > StarterServlet and web.xml
> >
> > *
> >
> > public
> > **class* StarterServlet *extends* HttpServlet {
> >
> > *public* *void* init(){
> >
> > *try*{
> >
> > Properties p =
> > *new* Properties();
> >
> > p.put(Context.
> > *INITIAL_CONTEXT_FACTORY*,
> > "org.apache.openejb.client.LocalInitialContextFactory");
> >
> > Context ctx =
> > *new* InitialContext(p);
> >
> > DefaultAnnotationProcessor processor =
> > *new* DefaultAnnotationProcessor(ctx);
> >
> > getServletContext().setAttribute(AnnotationProcessor.
> > *class*.getName(), processor);
> >
> > }
> > *catch*(Exception e){
> >
> > e.printStackTrace();
> >
> > }
> >
> > }
> >
> > }
> >
> > // Below is the section you need to add in web.xml
> >    <servlet>
> >     <servlet-name>Starter Servlet</servlet-name>
> >     <servlet-class>org.ui.beans.StarterServlet</servlet-class>
> >      <load-on-startup>10</load-on-startup>
> >   </servlet>
> > // UPDATE org.ui.beans.ResourceBean so that you provide the global JNDI
> > name
> > of the EJB in the annotation as shown below:
> >
> >
> > @EJB
> > (name="CounterImplLocal") *private* CounterLocal counter;
> >
> > Now try your example. Hopefully it should work. I got errors because
> > database tables did not exist. Please let us know if this works for you.
> >
> > PS:- I have been wrongly using the name ResourceBean for the RequestBean
> > in
> > my previous emails.
> >
> >
> > On Wed, May 7, 2008 at 1:16 AM, Karan Malhi <karan.malhi@gmail.com>
> wrote:
> >
> >> Here is the algorithm used to find the InjectionProvider:-
> >>
> >>
> >> /**
> >>
> >> *
> >> <p>Attempt to find an <code>InjectionProvider</code> based
on the
> >> following
> >>
> >> * algorithm:
> >> </p>
> >>
> >> *
> >> <ul>
> >>
> >> *
> >> <li>Check for an explicit configuration within the web.xml using
> >>
> >> * the key
> >> <code>com.sun.faces.injectionProvider</code>. If found,
> >>
> >> * return the value.
> >> </li>
> >>
> >> *
> >> <li>Check for a system property keyed by <code>
> >> com.sun.faces.InjectionProvider</code>.
> >>
> >> * If found, return the value.
> >> </li>
> >>
> >> *
> >> <li>Check for entries within <code>
> >> META-INF/services/com.sun.faces.injectionprovider</code>.
> >>
> >> * If entries are found and the entries extend
> >> <code>DiscoverableInjectionProvider</code>,
> >>
> >> * invoke
> >> <code>isInjectionFeatureAvailable(String)</code> passing in the
> >> configured
> >>
> >>
> >> * delegate. If
> >> <code>isInjectionFeatureAvailable(String)</code> returns
> >> <code>true</code>
> >>
> >> * return the service entry.
> >> </li>
> >>
> >> *
> >> <li>If no <code>InjectionProviders are found, return <code>null
> >> </code></li>
> >>
> >> * Tries to find a provider class in a web context parameter. If not
> >>
> >> * present it tries to find it as a System property. If still not found
> >>
> >> * returns null.
> >>
> >> *
> >> <ul>
> >>
> >> *
> >>
> >> * @param extContext The ExternalContext for this request
> >>
> >> * @return The provider class name specified in the container
> >> configuration,
> >>
> >> * or
> >> <code>null</code> if not found.
> >>
> >> */
> >>
> >>
> >>   On Wed, May 7, 2008 at 1:06 AM, Karan Malhi <karan.malhi@gmail.com>
> >> wrote:
> >>
> >> > David,
> >> >
> >> > I think the issue is with the
> >> > org.apache.catalina.util.DefaultAnnotationProcessor.
> >> >
> >> > Look at this portion of the error stack trace:-
> >> >
> >> >  org.apache.naming.NamingContext.lookup(NamingContext.java:770)
> >> > org.apache.naming.NamingContext.lookup(NamingContext.java:153)
> >> >
> >> >
> >>
> org.apache.catalina.util.DefaultAnnotationProcessor.lookupFieldResource(DefaultAnnotationProcessor.java:201)
> >> >
> >> >
> >>
> org.apache.catalina.util.DefaultAnnotationProcessor.processAnnotations(DefaultAnnotationProcessor.java:139)
> >> >
> >> >
> >>
> com.sun.faces.vendor.Tomcat6InjectionProvider.inject(Tomcat6InjectionProvider.java:46)
> >> >
> >> >
> >>
> com.sun.faces.config.ManagedBeanFactoryImpl.newInstance(ManagedBeanFactoryImpl.java:298)
> >> > First thing is that the JSF implementation by sun provides four
> >> > Injection Providers, one for glassfish,tomcat,jetty and a generic web
> >> > container. The one being used above is the
> >> > com.sun.faces.vendor.Tomcat6InjectionProvider. The inject method,
> then
> >> uses
> >> > the tomcat DefaultAnnotationProcessor to process annotations and
> lookup
> >> the
> >> > EJB in the NamingContext. This is where the problem is.
> >> > 1. I am not sure which context is being used by this
> >> > DefaultAnnotationProcessor. thats probably why the lookup is failing
> >> because
> >> > it is not looking up in the right location
> >> > 2. If you look at the lookupFieldResource() method, then it is
> >> lookingup
> >> > and EJB by @EJB.name() . if it does not find that (which it will not
> >> because
> >> > we are not specifying @EJB(name=something) in the ResourceBean, then
> it
> >> > looks up by JSF managed bean classname / field name i.e. in our case
> it
> >> is
> >> > org.ui.beans.ResourceBean. Hence the exception that it cannot find
> the
> >> name
> >> > org.ui.beans.ResourceBean in the NamingContext.
> >> >
> >> > What we would need to do is to add our own InjectionProvider and also
> >> > add our own AnnotationProcessor. Since the InjectionProvider will use
> >> the
> >> > AnnotationProcessor, we simply need to tell the JSF implementation on
> >> how to
> >> > get to our InjectionProvider. This can be done by setting a system
> >> property
> >> > named com.sun.faces.
> >> > InjectionProvider=org.apache.openejb.OurInjectionProvider
> >> >
> >> > I need some sleep now :), so provided the above info, just in case
> you
> >> > or somebody else might want to fix this. Otherwise, I will try to
> work
> >> on it
> >> > tomorrow.
> >> >
> >> > Below is the DefaultAnnotationProcessor (I have stripped off
> irrelevant
> >> > stuff from here):
> >> >
> >> >
> >> > public
> >> > class DefaultAnnotationProcessor implements AnnotationProcessor {
> >> >
> >> > protected javax.naming.Context context = null;
> >> >
> >> > public DefaultAnnotationProcessor(javax.naming.Context context) {
> >> >
> >> > this.context = context;
> >> >
> >> > }
> >> >
> >> > /**
> >> >
> >> > * Inject resources in specified instance.
> >> >
> >> > */
> >> >
> >> > public void processAnnotations(Object instance)
> >> >
> >> > throws IllegalAccessException, InvocationTargetException,
> >> > NamingException {
> >> >
> >> > if (context == null) {
> >> >
> >> > // No resource injection
> >> >
> >> > return;
> >> >
> >> > }
> >> >
> >> > // Initialize fields annotations
> >> >
> >> > Field[] fields = instance.getClass().getDeclaredFields();
> >> >
> >> > for (int i = 0; i < fields.length; i++) {
> >> >
> >> > if (fields[i].isAnnotationPresent(Resource.class)) {
> >> >
> >> > Resource annotation = (Resource) fields[i].getAnnotation(Resource.
> >> > class);
> >> >
> >> > lookupFieldResource(context, instance, fields[i], annotation.name());
> >> >
> >> > }
> >> >
> >> > if (fields[i].isAnnotationPresent(EJB.class)) {
> >> >
> >> > EJB annotation = (EJB) fields[i].getAnnotation(EJB.
> >> > class);
> >> >
> >> > lookupFieldResource(context, instance, fields[i], annotation.name());
> >> >
> >> > }
> >> >
> >> > if (fields[i].isAnnotationPresent(WebServiceRef.class)) {
> >> >
> >> > WebServiceRef annotation =
> >> >
> >> > (WebServiceRef) fields[i].getAnnotation(WebServiceRef.
> >> > class);
> >> >
> >> > lookupFieldResource(context, instance, fields[i], annotation.name());
> >> >
> >> > }
> >> >
> >> > if (fields[i].isAnnotationPresent(PersistenceContext.class)) {
> >> >
> >> > PersistenceContext annotation =
> >> >
> >> > (PersistenceContext) fields[i].getAnnotation(PersistenceContext.
> >> > class);
> >> >
> >> > lookupFieldResource(context, instance, fields[i], annotation.name());
> >> >
> >> > }
> >> >
> >> > if (fields[i].isAnnotationPresent(PersistenceUnit.class)) {
> >> >
> >> > PersistenceUnit annotation =
> >> >
> >> > (PersistenceUnit) fields[i].getAnnotation(PersistenceUnit.
> >> > class);
> >> >
> >> > lookupFieldResource(context, instance, fields[i], annotation.name());
> >> >
> >> > }
> >> >
> >> > }
> >> >
> >> >
> >> >
> >> > }
> >> >
> >> >  /**
> >> >
> >> > * Inject resources in specified field.
> >> >
> >> > */
> >> >
> >> > protected static void lookupFieldResource(javax.naming.Context
> context,
> >> >
> >> > Object instance, Field field, String name)
> >> >
> >> > throws NamingException, IllegalAccessException {
> >> >
> >> > Object lookedupResource = null;
> >> >
> >> > boolean accessibility = false;
> >> >
> >> > if ((name != null) &&
> >> >
> >> > (name.length() > 0)) {
> >> >
> >> > lookedupResource = context.lookup(name);
> >> >
> >> > }
> >> > else {
> >> >
> >> > lookedupResource = context.lookup(instance.getClass().getName() +
> >> > "/" + field.getName());
> >> >
> >> > }
> >> >
> >> > accessibility = field.isAccessible();
> >> >
> >> > field.setAccessible(
> >> > true);
> >> >
> >> > field.set(instance, lookedupResource);
> >> >
> >> > field.setAccessible(accessibility);
> >> >
> >> > }
> >> >
> >> >   On Tue, May 6, 2008 at 9:01 PM, David Blevins
> >> <david.blevins@visi.com>
> >> > wrote:
> >> >
> >> > >
> >> > > On May 5, 2008, at 6:30 PM, JimOR wrote:
> >> > >
> >> > > David Blevins wrote:
> >> > > >
> >> > > > > If you can whip up a tiny example that reproduces the problem,
> >> > > > > I'll be
> >> > > > > happy to take a look at it.  You can attach the war to this
> jira:
> >> > > > > http://issues.apache.org/jira/browse/OPENEJB-797
> >> > > > >
> >> > > > >
> >> > > > >
> >> > > > The jira has a zip attached containing IceFaces jars in ./lib
and
> a
> >> > > > ./webapps/IceSample.war.  The war contains a working EJB injected
> >> > > > servlet,
> >> > > > and the openejb.log shows that my  bean was created.
> >> > > >
> >> > > > Running the default page, main.jspx, results in the following
> >> > > > exception:
> >> > > > ERROR-
> >> > > >
> >>
> com.icesoft.faces.facelets.D2DFaceletViewHandler.renderResponse(Line:292)
> >> > > > -
> >> > > > Problem in renderResponse: javax.faces.FacesException:
> >> > > > javax.naming.NameNotFoundException: Name org.ui.beans.RequestBean
> >> is
> >> > > > not
> >> > > > bound in this Context
> >> > > > javax.faces.FacesException: javax.faces.FacesException:
> >> > > > javax.naming.NameNotFoundException: Name org.ui.beans.RequestBean
> >> is
> >> > > > not
> >> > > > bound in this Context
> >> > > >        at
> >> > > >
> >> > > >
> >>
> com.sun.faces.application.ApplicationAssociate.createAndMaybeStoreManagedBeans(ApplicationAssociate.java:560)
> >> > > >        at
> >> > > >
> >> > > >
> >>
> com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:82)
> >> > > >
> >> > > > [snip]
> >> > > >
> >> > > > Caused by: javax.faces.FacesException:
> >> > > > javax.naming.NameNotFoundException:
> >> > > > Name org.ui.beans.RequestBean is not bound in this Context
> >> > > >        at
> >> > > >
> >> > > >
> >>
> com.sun.faces.config.ManagedBeanFactoryImpl.newInstance(ManagedBeanFactoryImpl.java:340)
> >> > > >        at
> >> > > >
> >> > > >
> >>
> com.sun.faces.application.ApplicationAssociate.createAndMaybeStoreManagedBeans(ApplicationAssociate.java:550)
> >> > > >        ... 53 more
> >> > > > Caused by: javax.naming.NameNotFoundException: Name
> >> > > > org.ui.beans.RequestBean
> >> > > > is not bound in this Context
> >> > > >        at
> >> > > > org.apache.naming.NamingContext.lookup(NamingContext.java:770)
> >> > > >        at
> >> > > > org.apache.naming.NamingContext.lookup(NamingContext.java:153)
> >> > > >        at
> >> > > >
> >> > > >
> >>
> org.apache.catalina.util.DefaultAnnotationProcessor.lookupFieldResource(DefaultAnnotationProcessor.java:203)
> >> > > >
> >> > > > [snip]
> >> > > >
> >> > > >
> >> > > Hmmm.  I'm not sure I have the JSF expertise to figure out what the
> >> > > moving parts are.  Is there an IceFaces developer that we can pull
> >> into this
> >> > > thread?  Maybe between the two projects we can figure something
> out.
> >> > >
> >> > > Also, I am at JavaOne, so if there's someone from IceSoft around,
> I'd
> >> > > be happy to sit down with them.
> >> > >
> >> > > -David
> >> > >
> >> > >
> >> >
> >> >
> >> > --
> >> > Karan Singh Malhi
> >>
> >>
> >>
> >>
> >> --
> >> Karan Singh Malhi
> >
> >
> >
> >
> > --
> > Karan Singh Malhi
> >
> >
>
>
> --
> View this message in context:
> http://www.nabble.com/Tomcat-webapp-Configuration-tp17037589p17105692.html
>
> Sent from the OpenEJB User mailing list archive at Nabble.com.
>
>


-- 
Karan Singh Malhi

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message