[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openejb-user
Subject:    Re: Tomcat webapp Configuration
From:       "Karan Malhi" <karan.malhi () gmail ! com>
Date:       2008-05-07 14:14:35
Message-ID: ac85de250805070714p2c65eefelf50717365ca9b442 () mail ! gmail ! com
[Download RAW message or body]


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



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic