Difficult ClassLoader problems with multiple deployed enterprise Apps

Greetings!

When multiple instances of an enterprise application are deployed, ClassLoader issues are causing ClassCast Exceptions in the instantiation of Stateless SessionBeans. These ClassCast Exceptions are causing the Stateless Session beans to not be created appropriately/correctly, and in turn there is an InvocationTargetException resulting in an HTTP 500 Internal Server Error (mapped to a custom handler).

The setup is SJSAS2005Q2, JDK 1.5, MySQL 5.0, Linux (RedHat 9, and Debian 3.0/3.1)

Below is a typical example:

Exception creating stateless session bean : [{0}]java.lang.reflect.InvocationTargetException

<<long stack Trace omitted>>

Caused by: java.lang.ClassCastException: $Proxy111at com.acjust.ecommerce.ejb.preferences.PreferenceManagerBean.ejbCreate(PreferenceManagerBean.java:354)... 67 more

Here is the code from PreferenceManagerBean, the offending line is the (first one) that does a lookup on PreferencesBean and casts the result. This is a SessionFacade (there are many others) and they all (may) exhibit this behavior when there are multiple enterprise apps running.

publicvoid ejbCreate(){

LookupServiceHelper lookup = LookupServiceHelper.getInstance();

preferencesHome = (LocalPreferencesHome)

lookup.getLocalHome(IConstants.PREFERENCES_BEAN);

companyInformationHome = (LocalCompanyInformationHome)

lookup.getLocalHome(IConstants.COMPANY_INFORMATION_BEAN);

businessAddressHome = (LocalBusinessAddressHome)

lookup.getLocalHome(IConstants.BUSINESS_ADDRESS_BEAN);

sitePreferencesHome = (LocalSitePreferencesHome)

lookup.getLocalHome(IConstants.SITE_PREFERENCES_BEAN);

paymentPreferencesHome = (LocalPaymentPreferencesHome)

lookup.getLocalHome(IConstants.PAYMENT_PREFERENCES_BEAN);

productPreferencesHome = (LocalProductPreferencesHome)

lookup.getLocalHome(IConstants.PRODUCT_PREFERENCES_BEAN);

}

When there is one instance of the App, it works perfectly. When there are two instances, one works perfectly, and the other one will have the above issues with the instantiation of Stateless Session Beans (the broken enterprise app is the one that is NOT loaded or reloaded most recently).

Thinking that the problem may be solved by rearranging or repackaging the software, multiple solutions have been tried. (ClassCast Exceptions such as these are typically the result of helper classes being loaded by one class-loader, then loaded by another, compared or casted, and the two are not equivalent). In this case, though, the software is behaving as though each enterprise app does not have its own class loader hierarchy, which is obviously highly undesirable for the situation at-hand. At any rate, bundling all library classes at the app server classpath level, putting all library classes in each jar, and war, and putting all library classes in the ear/lib directory and using MANIFEST.MF classpath entries to point all ear subcomponents at the library classes - none of these potential solutions has alleviated this problem. In addition, the EJB classes themselves triggering the exception(s) are not helper classes but EJBs that are correctly packaged in their respective EJB-JARS.

Here is the sun SJSAS 8 classloader hierarchy from the userguide:

http://docs.sun.com/source/817-6087/dgdeploy.html#wp58491

Can somebody from the Sun App Server team speak to whether or not this is an Application Server issue? Why should the classloader hierarchy from one enterprise app interfere with any other? Are there known workarounds?

Any help is greatly appreciated.

Best, Adam

[3898 byte] By [adamjusta] at [2007-10-2 4:47:38]
# 1

Hi Adam,

Few questions for you :

1. Could you describe how the application was packaged the first time you encountered the problem? Were any of the application classes packaged outside of the .ear?

2. Could you explain the steps you took to deploy the same .ear multiple times? Was there any difference between the contents of the .ear with each deployment?

3. I'm assuming based on the names of the interfaces that these use the Local EJB view? How is LookupServiceHelper.lookup() defined? I assume it merely performs the java:comp/env/<IConstants.XYZ> lookup based on ejb-local-refs defined within the calling bean.

--ken

ksaksa at 2007-7-16 0:52:25 > top of Java-index,Enterprise & Remote Computing,Enterprise Technologies...
# 2

Hello Ken,

1) The first time the problem was encountered, the application was packaged for rapid iterative development. The third party libraries were installed on the Application Server's CLASSPATH. Because there are many megabytes of libraries, this speeded iterative development of the application but understandably caused ClassLoader problems when we tried to run multiple instances of the Enterprise App (eg struts was not designed to be packaged at the App Server CLASSPATH level). Currently, the libraries are all packaged in <ear>/lib directory, and each jar/war contains a MANIFEST.MF in META-INF adding every entry in <ear>/lib to the classpath. The idea is, that there is no duplication of the libraries within one application, and the libraries/an application can be updated without the need to reboot the Application Server.

2) The ears are slightly different, you are right. The code/libraries/packaging is the same. But, there are some small differences in the deployment descriptors to allow them to coexist. For instance, the jdbc resources are different, so that the CMP ejbs correctly refer to the right (different) connection pools for each enterprise app. Also, the web context-roots are different, otherwise the application will not deploy correctly. (PS, it would be nice to have the same context-roots, and given that each enterprise app is being deployed to a different virtual-server, it would seem that this should be allowed, but it is not?)

3) You are correct, again. Local Interfaces to the EJB's are being used. The LookupServerHelper lookup method is a caching JNDI lookup helper method adapted from Sun's J2EE Design Patterns text. I will post this method if you like. But it has worked perfectly (with one enterprise App) for a long time.

Many Thanks,

Adam

adamjusta at 2007-7-16 0:52:25 > top of Java-index,Enterprise & Remote Computing,Enterprise Technologies...
# 3

> Hello Ken,

>

> Currently, the

> libraries are all packaged in <ear>/lib directory,

> and each jar/war contains a MANIFEST.MF in META-INF

> adding every entry in <ear>/lib to the classpath.

Is it possible there's something hanging around on the server classpath from the prototyping phase? Might want to either double-check the exact contents of the server classpath (printed in server.log during startup) or re-install the appserver to create a fresh domain. As you mentioned, if all the application code is packaged within the .ear there shouldn't be any clashing since each application has its own application classloader.

>

> 2) The ears are slightly different, you are right.

Does each .ear have a different file name? When you deploy do you specify a different application name for each one, e.g. using "asadmin deploy --name app1 ..." ?

>

> 3) Local Interfaces to the EJB's are being used.

Sure, go ahead and post it.I assume the LookupServerHelper is also packaged within each .ear? Can you also post the full stack trace for the ClassCastException. Might be some useful information in there somewhere.

Finally, double-check that the "delegate" attribute in your sun-web.xmls is either not set OR set to true. This is a feature that forces the web container to change the way it does classloading within an application. It's probably not related to this problem but we've had a lot of classloading issues with it in the past so it's worth at least ruling out.

--ken

>

> Many Thanks,

>

> Adam

ksaksa at 2007-7-16 0:52:25 > top of Java-index,Enterprise & Remote Computing,Enterprise Technologies...
# 4

Hi Ken,

I have pretty much ruled out "artifacts" in the Application Server's Classpath, because we already tried reinstalling the Application Server. It is a freshly downloaded SJSAS 8 2005 Q2 downloaded a few days ago with nothing added to the Server Classpath other than a database driver [${com.sun.aas.installRoot}/mysql/lib/mysql-connector-java-3.1.11-bin.jar added to the server CLASSPATH suffix after the PointBase driver(s)].

Yes, each ear has its own name. Once the two enterprise apps have been created/packaged by the ANT build script (they are the same except for the slight differences in deployment descriptors we discussed earlier), one is renamed and we use the SJSAS administrative console to deploy them, both deploy correctly, without errors and begin listening for connections at their respective context-roots. Each enterprise application has two web-wars, one public/customer facing, and one administrative. The first enterprise app listens on /e (public facing) and /a (administrative) and the second listens on / (public facing) and /admin (administrative).

Also, you are correct; each ear has its own copy of the LookupServiceHelper class. Again, there is nothing shared on the App Server Classpath other than that jdbc driver for mysql.

Here is the LookupServiceHelper code:

package com.acjust.ecommerce.util;

import java.sql.Connection;

import java.sql.SQLException;

import java.util.Collections;

import java.util.HashMap;

import java.util.Map;

import java.util.logging.Logger;

import javax.ejb.EJBLocalHome;

import javax.naming.InitialContext;

import javax.naming.NamingException;

import javax.sql.DataSource;

/**

* This class provides JNDI helper functions to look up EJB

* Home implementations.

* @author Copyright (c) 1998-2005 by A. C. Just, Inc. All Rights Reserved.

*/

public class LookupServiceHelper {

/**

* This is the only object of type LookupServiceHelper; this class

* is a singleton.

*/

private static LookupServiceHelper instance = null;

/**

* The logging object for this singleton

*/

private final Logger logger = Logger.getLogger(getClass().getName());

private InitialContext initialContext = null;

private Map cache = null;

/**

* The no argument constructor is private to enforce the fact

* that we do not want to create any other instances of this

* class.

*/

private LookupServiceHelper() {

try {

initialContext = new InitialContext();

cache = Collections.synchronizedMap(new HashMap());

} catch (NamingException ne) {

throw new LookupServiceException(ne);

} catch (Exception e) {

throw new LookupServiceException(e);

}

}

/**

* This method returns the only object of this class.

* @return instance The only object of type LookupServiceHelper.

*/

public static LookupServiceHelper getInstance() {

if(null == instance) {

try {

instance = new LookupServiceHelper();

} catch (LookupServiceException lse) {

instance.logger.severe("Failed to create lookup service " +

lse.getMessage());

}

}

return instance;

}

/**

* This utility method looks up an enterprise JavaBean

* in the distributed naming service. It is not type safe;

* that property is guaranteed by the callers.

* @param bean The name of the enterprise JavaBean to find

* in the naming service (a prefix will be automatically added).

* @return An Object that can be casted to a LocalHomeInterface.

*/

public EJBLocalHome getLocalHome(String bean) {

EJBLocalHome localHome = null;

logger.entering("LookupServiceHelper","getLocalHome",bean);

try {

String jndiHomeName = getFullyQualifiedEJBName(bean);

logger.info("looking for " + jndiHomeName);

if (cache.containsKey(jndiHomeName)) {

logger.info("found cached reference");

localHome = (EJBLocalHome) cache.get(jndiHomeName);

} else {

logger.info("no reference found; performing lookup");

localHome = (EJBLocalHome) initialContext.lookup(jndiHomeName);

cache.put(jndiHomeName, localHome);

}

} catch (NamingException ne) {

throw new LookupServiceException(ne);

} catch (Exception e) {

throw new LookupServiceException(e);

}

logger.exiting("LookupServiceHelper","getLocalHome",localHome);

return localHome;

}

/**

* This utility method looks up a javax.mail.Session session

* in the distributed naming service. It is not type safe;

* that property is guaranteed by the callers.

* @param resource The name of the mail session resource to find

* in the naming service (a prefix will be automatically added).

* @return An Object that can be casted to a javax.mail.Session.

*/

public javax.mail.Session getMailSession(String resource) {

javax.mail.Session session = null;

logger.entering("LookupServiceHelper","getMailSession",resource);

try {

String jndiName = getFullyQualifiedMailResourceName(resource);

logger.info("looking for " + jndiName);

if (cache.containsKey(jndiName)) {

logger.info("found cached reference");

session = (javax.mail.Session) cache.get(jndiName);

} else {

logger.info("no reference found; performing lookup");

session = (javax.mail.Session) initialContext.lookup(jndiName);

cache.put(jndiName, session);

}

} catch (NamingException ne) {

throw new LookupServiceException(ne);

} catch (Exception e) {

throw new LookupServiceException(e);

}

logger.exiting("LookupServiceHelper","getMailSession",session);

return session;

}

/**

* Get a connection from the database pool.

*

* @return Connection

*/

public Connection getDBConnection(String resource) {

Connection connection = null;

try {

String jndiName = getFullyQualifiedDBName(resource);

logger.info("looking for " + jndiName);

if(cache.containsKey(jndiName)) {

logger.info("found cached reference");

connection = (Connection) cache.get(jndiName);

} else {

logger.info("no reference found; performing lookup");

DataSource dataSource = (DataSource) initialContext

.lookup(jndiName);

connection = dataSource.getConnection();

//do not cache the database connection;

//you will get an IllegalStateException if you do

//cache.put(jndiName,connection);

}

} catch(NamingException ne) {

logger.warning("getConnection failed (naming): " + ne.getMessage());

throw new LookupServiceException(ne);

} catch (SQLException sql) {

logger.warning("getConnection failed (db): " + sql.getMessage());

throw new LookupServiceException(sql);

}

return connection;

}

/**

* This utility method takes an enterprise JavaBean name

* and combines it with a prefix to form a fully qualified name

* suitable for using to query the distributed naming service.

* @param bean The name of the enterprise JavaBean to add.

* @return The fully qualified name (e.g. java:comp/env/ejb/ABeanRef).

*/

private String getFullyQualifiedEJBName(String bean) {

return IConstants.JNDI_EJB_PREFIX + bean;

}

/**

* This utility method takes a messaging resource name

* and combines it with a prefix to form a fully qualified name

* suitable for using to query the distributed naming service.

* @param resource The name of the mail resource

* @return The fully qualified name (e.g. java:comp/env/mail/MailSessionRef).

*/

private String getFullyQualifiedMailResourceName(String resource) {

return IConstants.JNDI_MAIL_PREFIX + resource;

}

/**

* This utility method takes a messaging resource name

* and combines it with a prefix to form a fully qualified name

* suitable for using to query the distributed naming service.

* @param jdbc The name of the JDBC resource.

* @return The fully qualified name (e.g. java:comp/env/jdbc/mysql).

*/

private String getFullyQualifiedDBName(String resource) {

return IConstants.JNDI_DB_PREFIX + resource;

}

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Some sample exception stack trace(s) (this is a different stateless session than the one before - but indicative of the same problem).

[#|2005-11-10T14:00:20.566-0800|INFO|sun-appserver-pe8.1_02|javax.enterprise.system.container.ejb|_ThreadID=29;|EJB5070: Exception creating stateless session bean : [{0}]

java.lang.reflect.InvocationTargetException

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:585)

at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:410)

at com.sun.ejb.containers.StatelessSessionContainer.access$100(StatelessSessionContainer.java:75)

at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:597)

at com.sun.ejb.containers.util.pool.NonBlockingPool.getObject(NonBlockingPool.java:168)

at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:359)

at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:1072)

at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:772)

at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:126)

at $Proxy167.authenticateCustomer(Unknown Source)

at com.acjust.ecommerce.web.businessdelegate.customer.CustomerManagerBusinessDelegate.authenticate(CustomerManagerBusinessDelegate.java:77)

at com.acjust.ecommerce.web.action.customer.LoginAction.execute(LoginAction.java:29)

at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)

at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:747)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:860)

at sun.reflect.GeneratedMethodAccessor297.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:585)

at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAsPrivileged(Subject.java:517)

at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)

at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:257)

at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:55)

at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:161)

at java.security.AccessController.doPrivileged(Native Method)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:263)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:225)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:173)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:132)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:933)

at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:185)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:653)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:534)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.doTask(ProcessorTask.java:403)

at com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:55)

Caused by: java.lang.ClassCastException: $Proxy214

at com.acjust.ecommerce.ejb.client.customermanager.CustomerManagerBean.ejbCreate(CustomerManagerBean.java:71)

... 49 more

|#]

[#|2005-11-10T14:00:20.577-0800|INFO|sun-appserver-pe8.1_02|javax.enterprise.system.container.ejb|_ThreadID=29;|EJB5018: An exception was thrown during an ejb invocation on [CustomerManagerBean]|#]

[#|2005-11-10T14:00:20.578-0800|INFO|sun-appserver-pe8.1_02|javax.enterprise.system.container.ejb|_ThreadID=29;|

javax.ejb.EJBException: nested exception is: javax.ejb.EJBException: nested exception is: javax.ejb.CreateException: Could not create stateless EJB: java.lang.reflect.InvocationTargetException

javax.ejb.EJBException: nested exception is: javax.ejb.CreateException: Could not create stateless EJB: java.lang.reflect.InvocationTargetException

javax.ejb.CreateException: Could not create stateless EJB: java.lang.reflect.InvocationTargetException

at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:418)

at com.sun.ejb.containers.StatelessSessionContainer.access$100(StatelessSessionContainer.java:75)

at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:597)

at com.sun.ejb.containers.util.pool.NonBlockingPool.getObject(NonBlockingPool.java:168)

at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:359)

at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:1072)

at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:772)

at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:126)

at $Proxy167.authenticateCustomer(Unknown Source)

at com.acjust.ecommerce.web.businessdelegate.customer.CustomerManagerBusinessDelegate.authenticate(CustomerManagerBusinessDelegate.java:77)

at com.acjust.ecommerce.web.action.customer.LoginAction.execute(LoginAction.java:29)

at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)

at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:747)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:860)

at sun.reflect.GeneratedMethodAccessor297.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:585)

at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAsPrivileged(Subject.java:517)

at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)

at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:257)

at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:55)

at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:161)

at java.security.AccessController.doPrivileged(Native Method)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:263)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:225)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:173)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:132)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:933)

at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:185)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:653)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:534)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.doTask(ProcessorTask.java:403)

at com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:55)

javax.ejb.EJBException: nested exception is: javax.ejb.CreateException: Could not create stateless EJB: java.lang.reflect.InvocationTargetException

at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:599)

at com.sun.ejb.containers.util.pool.NonBlockingPool.getObject(NonBlockingPool.java:168)

at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:359)

at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:1072)

at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:772)

at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:126)

at $Proxy167.authenticateCustomer(Unknown Source)

at com.acjust.ecommerce.web.businessdelegate.customer.CustomerManagerBusinessDelegate.authenticate(CustomerManagerBusinessDelegate.java:77)

at com.acjust.ecommerce.web.action.customer.LoginAction.execute(LoginAction.java:29)

at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)

at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:747)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:860)

at sun.reflect.GeneratedMethodAccessor297.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:585)

at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAsPrivileged(Subject.java:517)

at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)

at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:257)

at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:55)

at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:161)

at java.security.AccessController.doPrivileged(Native Method)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:263)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:225)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:173)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:132)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:933)

at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:185)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:653)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:534)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.doTask(ProcessorTask.java:403)

at com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:55)

javax.ejb.EJBException: nested exception is: javax.ejb.EJBException: nested exception is: javax.ejb.CreateException: Could not create stateless EJB: java.lang.reflect.InvocationTargetException

at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:364)

at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:1072)

at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:772)

at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:126)

at $Proxy167.authenticateCustomer(Unknown Source)

at com.acjust.ecommerce.web.businessdelegate.customer.CustomerManagerBusinessDelegate.authenticate(CustomerManagerBusinessDelegate.java:77)

at com.acjust.ecommerce.web.action.customer.LoginAction.execute(LoginAction.java:29)

at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)

at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:747)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:860)

at sun.reflect.GeneratedMethodAccessor297.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:585)

at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAsPrivileged(Subject.java:517)

at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)

at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:257)

at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:55)

at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:161)

at java.security.AccessController.doPrivileged(Native Method)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:263)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:225)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:173)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:132)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:933)

at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:185)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:653)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:534)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.doTask(ProcessorTask.java:403)

at com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:55)

|#]

[#|2005-11-10T14:00:20.651-0800|WARNING|sun-appserver-pe8.1_02|org.apache.struts.action.RequestProcessor|_ThreadID=29;|Unhandled Exception thrown: class javax.ejb.EJBException|#]

[#|2005-11-10T14:00:20.779-0800|SEVERE|sun-appserver-pe8.1_02|javax.enterprise.system.container.web|_ThreadID=29;|StandardWrapperValve[action]: Servlet.service() for servlet action threw exception

javax.ejb.EJBException: nested exception is: javax.ejb.EJBException: nested exception is: javax.ejb.CreateException: Could not create stateless EJB: java.lang.reflect.InvocationTargetException

javax.ejb.EJBException: nested exception is: javax.ejb.CreateException: Could not create stateless EJB: java.lang.reflect.InvocationTargetException

javax.ejb.CreateException: Could not create stateless EJB: java.lang.reflect.InvocationTargetException

at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:418)

at com.sun.ejb.containers.StatelessSessionContainer.access$100(StatelessSessionContainer.java:75)

at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:597)

at com.sun.ejb.containers.util.pool.NonBlockingPool.getObject(NonBlockingPool.java:168)

at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:359)

at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:1072)

at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:772)

at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:126)

at $Proxy167.authenticateCustomer(Unknown Source)

at com.acjust.ecommerce.web.businessdelegate.customer.CustomerManagerBusinessDelegate.authenticate(CustomerManagerBusinessDelegate.java:77)

at com.acjust.ecommerce.web.action.customer.LoginAction.execute(LoginAction.java:29)

at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)

at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:747)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:860)

at sun.reflect.GeneratedMethodAccessor297.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:585)

at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAsPrivileged(Subject.java:517)

at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)

at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:257)

at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:55)

at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:161)

at java.security.AccessController.doPrivileged(Native Method)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:263)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:225)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:173)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:132)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:933)

at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:185)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:653)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:534)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.doTask(ProcessorTask.java:403)

at com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:55)

javax.ejb.EJBException: nested exception is: javax.ejb.CreateException: Could not create stateless EJB: java.lang.reflect.InvocationTargetException

at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:599)

at com.sun.ejb.containers.util.pool.NonBlockingPool.getObject(NonBlockingPool.java:168)

at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:359)

at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:1072)

at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:772)

at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:126)

at $Proxy167.authenticateCustomer(Unknown Source)

at com.acjust.ecommerce.web.businessdelegate.customer.CustomerManagerBusinessDelegate.authenticate(CustomerManagerBusinessDelegate.java:77)

at com.acjust.ecommerce.web.action.customer.LoginAction.execute(LoginAction.java:29)

at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)

at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:747)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:860)

at sun.reflect.GeneratedMethodAccessor297.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:585)

at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAsPrivileged(Subject.java:517)

at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)

at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:257)

at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:55)

at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:161)

at java.security.AccessController.doPrivileged(Native Method)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:263)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:225)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:173)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:132)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:933)

at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:185)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:653)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:534)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.doTask(ProcessorTask.java:403)

at com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:55)

javax.ejb.EJBException: nested exception is: javax.ejb.EJBException: nested exception is: javax.ejb.CreateException: Could not create stateless EJB: java.lang.reflect.InvocationTargetException

at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:364)

at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:1072)

at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:772)

at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:126)

at $Proxy167.authenticateCustomer(Unknown Source)

at com.acjust.ecommerce.web.businessdelegate.customer.CustomerManagerBusinessDelegate.authenticate(CustomerManagerBusinessDelegate.java:77)

at com.acjust.ecommerce.web.action.customer.LoginAction.execute(LoginAction.java:29)

at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)

at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:747)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:860)

at sun.reflect.GeneratedMethodAccessor297.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:585)

at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAsPrivileged(Subject.java:517)

at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)

at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:257)

at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:55)

at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:161)

at java.security.AccessController.doPrivileged(Native Method)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:263)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:225)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:173)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:132)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:933)

at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:185)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:653)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:534)

at com.sun.enterprise.web.connector.grizzly.ProcessorTask.doTask(ProcessorTask.java:403)

at com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:55)

|#]

The sun-web.xml on the customer facing web-war (does not set "delegate"):

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 8.0 Servlet 2.4//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_2_4-0.dtd">

<sun-web-app>

<context-root>/e</context-root>

</sun-web-app>

Here is the sun-web.xml on the administrative side (also does not set "delegate"):

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 8.0 Servlet 2.4//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_2_4-0.dtd">

<sun-web-app>

<context-root>/a</context-root>

<security-role-mapping>

<role-name>administrator</role-name>

<group-name>staff</group-name>

</security-role-mapping>

<resource-ref>

<res-ref-name>jdbc/mysql</res-ref-name>

<jndi-name>jdbc/mysql</jndi-name>

</resource-ref>

</sun-web-app>

Many Thanks,

Adam

adamjusta at 2007-7-16 0:52:25 > top of Java-index,Enterprise & Remote Computing,Enterprise Technologies...
# 5

Hi Adam,

OK, we're getting there... This doesn't sound like a classloader issue per se. My hunch is that the java:comp/env ejb-local-ref lookup is somehow returning the ejb local object from the wrong app. That's one explanation for the behavior you're seeing.Can I ask you to do the following :

1. Undeploy your two apps.

2. Stop the server.

3. Set ejb-container="FINE" and naming="FINE" within the module-log-levels element in domains/domain1/domain.xml.

4. Rename the domains/domain1/server.log so that the server creates a fresh one upon startup.

5. Start the server.

6. Go through the same deployment/execution steps as before to reproduce the problem.

7. Stop the server (without undeploying your apps)

8. Send me(kenneth.saks@sun.com) the following :

a) server.log

b) tarred/zipped versions of these directories :

domains/domain1/applications/j2ee-apps/<your_app1>

domains/domain1/applications/j2ee-apps/<your_app2>

domains/domain1/generated

--ken

ksaksa at 2007-7-16 0:52:25 > top of Java-index,Enterprise & Remote Computing,Enterprise Technologies...
# 6

Hi Ken,

Your suggestion (changing the display name in the application.xml of one of the ear's) fixed the problem. Thank you so much.

To recap: Two enterprise ears were (misbehaving) when deployed simultaneously to the same app server. One behaved as though it were trying to access the ejb's/classes/or classloaders of the other. The result was one working enterprise app and one that was unable to instantiate stateless session beans (causing internal application errors).

Ken suggested increasing the verbosity on the logging, isolating the problem in the environment, and spotted the fact that though the second application had been renamed, in its configuration, its display named remained the same as the original. His suggestion to change the display-name in application.xml and redeploy both enterprise apps solved the problem.

Thank you so much, Ken!

Adam

adamjusta at 2007-7-16 0:52:25 > top of Java-index,Enterprise & Remote Computing,Enterprise Technologies...
# 7

Hi Adam,

Good to hear your apps are working. Just want to be clear that this is technically a bug in the appserver, not a user-error.The bug is that one piece of the appserver code is assuming the application.xml <display-name> element is a unique application name. However, the J2EE specs don't require those semantics of display-name.The code should instead be using the application registration name that is provided/inferred at deployment-time. That's the name that is required to be unique.This will be fixed in our Java EE 5 release.

--ken

ksaksa at 2007-7-16 0:52:25 > top of Java-index,Enterprise & Remote Computing,Enterprise Technologies...