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 05:53:31 GMT
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

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