On Apr 12, 2007, at 9:50 AM, Richard Wallace wrote:
I think I found the source of the problem described below. I've tried
deploying a simple ear with a webapp that has the following jsp
<html>
<head>
<title>Hidden Classes Test</title>
</head>
<body bgcolor="white">
<%
Object o = new
org.apache.xbean.propertyeditor.ArrayListEditor ();
out.println (o);
%>
</body>
</html>
I tested this with Geronimo 1.1. I copied the
repository/org/apache/xbean directory to my Geronimo 1.1 repository
from
my Geronimo 2.0-M3 installation. If I leave the
geronimo-application.xml file without any hidden-classes or
dependencies, this JSP won't compile because
"org.apache.xbean.propertyeditor.ArrayListEditor cannot be resolved
to a
type". To get it to work in Geronimo 1.1 I have to manually
specify in
the geronimo-application.xml that I want to use the xbean-reflect
package in the Geronimo 1.1 repository.
In Geronimo 2.0-M3, it appears as tho everything in the Geronimo
repository is available to the application.
No. What is happening is that xbean-reflect is used in the web
container whose classloader is a parent of your app's classloader.
So, when I deploy the
application and hit the above JSP, it is able to successfully
create the
ArrayListEditor, even when there are no dependencies listed in the
geronimo-application.xml file. It also seems that if I try to hide
the
package with this geronimo-application.xml file
<?xml version="1.0" encoding="UTF-8"?>
<application
xmlns="http://geronimo.apache.org/xml/ns/j2ee/application-1.2">
<environment
xmlns="http://geronimo.apache.org/xml/ns/deployment-1.2">
<moduleId>
<groupId>${pom.groupId}</groupId>
<artifactId>${pom.artifactId}</artifactId>
<version>${version}</version>
<type>ear</type>
</moduleId>
<hidden-classes>
<filter>org.apache.xbean</filter>
</hidden-classes>
</environment>
</application>
the JSP is able to compile and run just fine, leading me to believe
that
the hidden-classes in my geronimo-application.xml file are being
ignored. Am I missing something or is this a bug?
I think that if you exclude the class in a geronimo-web.xml it will
be successfully excluded. It's getting pulled in from the web
container's classloader which is a parent of the web app classloader
but not the ear classloader.
Hope I'm right and this helps :-)
david jencks
Thanks,
Rich
Richard Wallace wrote:
I'm trying to get the full Geronimo 2 working just for my own
edification and am still running into some problems. I tried just
disabling the cxf stuff, but it seemed to keep getting reenabled. I
uninstalled it and got past that problem. Now I'm running into a
problem with the xbean library. I'm getting the following:
org.springframework.beans.factory.access.BootstrapException:
Unable to
initialize group definition. Group resource name
[classpath:/shared-context.xml], factory key [shared-context]; nested
exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'shared-context' defined in class path
resource [shared-context.xml]: Instantiation of bean failed; nested
exception is org.apache.xbean.propertyeditor.PropertyEditorException:
Value is not an instance of String
Caused by:
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'shared-context' defined in class path
resource [shared-context.xml]: Instantiation of bean failed; nested
exception is org.apache.xbean.propertyeditor.PropertyEditorException:
Value is not an instance of String
Caused by:
org.apache.xbean.propertyeditor.PropertyEditorException: Value is not
an instance of String
at
org.apache.xbean.propertyeditor.AbstractConverter.setValue
(AbstractConverter.java:67)
at
org.springframework.beans.TypeConverterDelegate.doConvertValue
(TypeConverterDelegate.java:269)
at
org.springframework.beans.TypeConverterDelegate.convertIfNecessary
(TypeConverterDelegate.java:192)
at
org.springframework.beans.TypeConverterDelegate.convertIfNecessary
(TypeConverterDelegate.java:107)
at
org.springframework.beans.BeanWrapperImpl.convertIfNecessary
(BeanWrapperImpl.java:356)
at
org.springframework.beans.factory.support.ConstructorResolver.createA
rgumentArray(ConstructorResolver.java:422)
at
org.springframework.beans.factory.support.ConstructorResolver.autowir
eConstructor(ConstructorResolver.java:140)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBean
Factory.autowireConstructor
(AbstractAutowireCapableBeanFactory.java:773)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBean
Factory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:
716)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBean
Factory.createBean(AbstractAutowireCapableBeanFactory.java:386)
at
org.springframework.beans.factory.support.AbstractBeanFactory
$1.getObject(AbstractBeanFactory.java:251)
at
org.springframework.beans.factory.support.DefaultSingletonBeanRegistr
y.getSingleton(DefaultSingletonBeanRegistry.java:144)
at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean
(AbstractBeanFactory.java:248)
at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean
(AbstractBeanFactory.java:160)
at
org.springframework.beans.factory.support.DefaultListableBeanFactory.
preInstantiateSingletons(DefaultListableBeanFactory.java:279)
I tried adding using the following plan to deploy the EAR file,
but it
didn't seem to change anything.
<?xml version="1.0" encoding="UTF-8"?>
<application
xmlns="http://geronimo.apache.org/xml/ns/j2ee/application-1.1"
xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.1"
xmlns:security="http://geronimo.apache.org/xml/ns/security-1.1"
application-name="ExampleApp">
<sys:environment>
<sys:moduleId>
<sys:groupId>com.contentconnections.guts</sys:groupId>
<sys:artifactId>example-app</sys:artifactId>
<sys:version>0.1-SNAPSHOT</sys:version>
<sys:type>car</sys:type>
</sys:moduleId>
<sys:hidden-classes>
<sys:filter>org.springframework</sys:filter>
<sys:filter>org.hibernate</sys:filter>
<sys:filter>org.apache.cxf</sys:filter>
<sys:filter>org.apache.xbean</sys:filter>
</sys:hidden-classes>
</sys:environment>
</application>
Any hints, or should I maybe stick with Little-G for now?
Thanks,
Rich
David Jencks wrote:
I think you should try turning off cxf support in
var/config/config.xml by adding load="false" to the module for
cxf-builder. That ought to eliminate cxf from your classpath.
Not an ideal solution but it should work.
cxf is producing new snapshots every day or two so if you build
trunk you may also find this problem solved.
You might be able to use hidden-classes to get around this problem.
thanks david jencks
On Apr 11, 2007, at 9:40 AM, Richard Wallace wrote:
Hello again,
I've decided to try a completely different tact than what I was
trying before. Rather than try and create a bunch of special
GBeans I noticed from a couple of places
(http://forum.springframework.org/showthread.php?
t=14200&highlight=locatorFactorySelector
mainly) that Spring has support for this sort of thing sorta
baked in. The only trick is to get that global context in a root
classloader so that it can be shared.
I tried this by putting the jars in a classpath entry in the ear
MANIFEST.MF file as mentioned here
http://mail-archives.apache.org/mod_mbox/geronimo-user/200701.mbox/
[EMAIL PROTECTED]
But as mentioned in another post
(http://mail-archives.apache.org/mod_mbox/geronimo-user/
200612.mbox/%
[EMAIL PROTECTED]),
this leads to everything being loaded in separate classloaders
per webapp.
So, this lead me to the discovery of the JEE5 support for the
/lib directory inside an EAR that will load all the jars into a
parent classpath that all modules can use. I downloaded
geronimo-jetty6-jee5-2.0-M3, started it up, and deployed my EAR
with the spring and all my application code in the root lib
directory.
Spring failed to load. Here's the stack trace.
09:04:55,548 WARN [JettyModuleBuilder] Web application
example-webapp-0.1-SNAPSHOT.war does not contain a
WEB-INF/geronimo-web.xml deployment plan. This may or may not be
a problem, depending on whether you have things like resource
references that need to be resolved. You can also give the
deployer a separate deployment plan file on the command line.
09:04:55,615 WARN [JettyModuleBuilder] Web application
example-webapp2.war does not contain a WEB-INF/geronimo-web.xml
deployment plan. This may or may not be a problem, depending on
whether you have things like resource references that need to be
resolved. You can also give the deployer a separate deployment
plan file on the command line. 2007-04-11
09:04:56.535:/example:INFO: Initializing Spring root
WebApplicationContext 09:04:56,535 INFO [ContextLoader] Root
WebApplicationContext: initialization started 09:04:56,592 INFO
[ClassPathXmlApplicationContext] Refreshing
org.springframework.context.support.ClassPathXmlApplicationContext@
6be45d:
display name
[EMAIL PROTECTED]
be45d];
startup date [Wed Apr 11 09:04:56 MST 2007]; root of context
hierarchy 09:04:56,725 INFO [XmlBeanDefinitionReader] Loading
XML bean definitions from class path resource
[shared-context.xml] 09:04:58,850 ERROR [ContextLoader] Context
initialization failed
org.springframework.beans.factory.access.BootstrapException:
Unable to initialize group definition. Group resource name
[classpath:/shared-context.xml], factory key [shared-context];
nested exception is
org.springframework.beans.factory.BeanDefinitionStoreException:
Unexpected exception parsing XML document from class path
resource [shared-context.xml]; nested exception is
java.lang.IllegalArgumentException: Class
[org.apache.cxf.transport.http.spring.NamespaceHandler] does not
implement the NamespaceHandler interface Caused by:
org.springframework.beans.factory.BeanDefinitionStoreException:
Unexpected exception parsing XML document from class path
resource [shared-context.xml]; nested exception is
java.lang.IllegalArgumentException: Class
[org.apache.cxf.transport.http.spring.NamespaceHandler] does not
implement the NamespaceHandler interface Caused by:
java.lang.IllegalArgumentException: Class
[org.apache.cxf.transport.http.spring.NamespaceHandler] does not
implement the NamespaceHandler interface at
org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver
.initHandlerMappings(DefaultNamespaceHandlerResolver.java:119)
at
org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver
.<init>(DefaultNamespaceHandlerResolver.java:96)
at
org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver
.<init>(DefaultNamespaceHandlerResolver.java:82)
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.createD
efaultNamespaceHandlerResolver(XmlBeanDefinitionReader.java:489)
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.createR
eaderContext(XmlBeanDefinitionReader.java:478)
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registe
rBeanDefinitions(XmlBeanDefinitionReader.java:458)
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadB
eanDefinitions(XmlBeanDefinitionReader.java:353)
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBea
nDefinitions(XmlBeanDefinitionReader.java:303)
at
org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBea
nDefinitions(XmlBeanDefinitionReader.java:280)
at
org.springframework.beans.factory.support.AbstractBeanDefinitionReade
r.loadBeanDefinitions(AbstractBeanDefinitionReader.java:131)
at
org.springframework.beans.factory.support.AbstractBeanDefinitionReade
r.loadBeanDefinitions(AbstractBeanDefinitionReader.java:147)
at
org.springframework.beans.factory.support.AbstractBeanDefinitionReade
r.loadBeanDefinitions(AbstractBeanDefinitionReader.java:173)
at
org.springframework.context.support.AbstractXmlApplicationContext.loa
dBeanDefinitions(AbstractXmlApplicationContext.java:112)
at
org.springframework.context.support.AbstractXmlApplicationContext.loa
dBeanDefinitions(AbstractXmlApplicationContext.java:79)
at
org.springframework.context.support.AbstractRefreshableApplicationCon
text.refreshBeanFactory(AbstractRefreshableApplicationContext.java:
100)
at
org.springframework.context.support.AbstractApplicationContext.refres
h(AbstractApplicationContext.java:313)
at
org.springframework.context.access.ContextSingletonBeanFactoryLocator
.initializeDefinition(ContextSingletonBeanFactoryLocator.java:137)
at
org.springframework.beans.factory.access.SingletonBeanFactoryLocator.
useBeanFactory(SingletonBeanFactoryLocator.java:381)
at
org.springframework.web.context.ContextLoader.loadParentContext
(ContextLoader.java:311)
at
org.springframework.web.context.ContextLoader.initWebApplicationConte
xt(ContextLoader.java:180)
at
org.springframework.web.context.ContextLoaderListener.contextInitiali
zed(ContextLoaderListener.java:49)
at
org.mortbay.jetty.handler.ContextHandler.startContext
(ContextHandler.java:511)
at
org.mortbay.jetty.servlet.Context.startContext(Context.java:135)
at
org.mortbay.jetty.webapp.WebAppContext.startContext
(WebAppContext.java:1191)
at
org.mortbay.jetty.handler.ContextHandler.doStart
(ContextHandler.java:481)
at
org.mortbay.jetty.webapp.WebAppContext.doStart
(WebAppContext.java:434)
at
org.mortbay.component.AbstractLifeCycle.start
(AbstractLifeCycle.java:40)
at
org.apache.geronimo.jetty6.JettyWebAppContext
$StartCommand.lifecycleMethod(JettyWebAppContext.java:355)
at
org.apache.geronimo.jetty6.handler.AbstractImmutableHandler.lifecycle
Command(AbstractImmutableHandler.java:52)
at
org.apache.geronimo.jetty6.handler.ThreadClassloaderHandler.lifecycle
Command(ThreadClassloaderHandler.java:57)
at
org.apache.geronimo.jetty6.handler.AbstractImmutableHandler.lifecycle
Command(AbstractImmutableHandler.java:50)
at
org.apache.geronimo.jetty6.handler.ComponentContextHandler.lifecycleC
ommand(ComponentContextHandler.java:57)
at
org.apache.geronimo.jetty6.handler.AbstractImmutableHandler.lifecycle
Command(AbstractImmutableHandler.java:50)
at
org.apache.geronimo.jetty6.handler.InstanceContextHandler.lifecycleCo
mmand(InstanceContextHandler.java:81)
The problem seems to be that the class
org.apache.cxf.transport.http.spring.NamespaceHandler doesn't
implement the Spring NamespaceHandler interface. Having no idea
where that even came from I google'd "cxf apache" and found the
Apache CXF project in the incubator. I browsed the SVN repo and
eventually found this,
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/transports/
http/src/main/java/org/apache/cxf/transport/http/spring/
NamespaceHandler.java?revision=501982&view=markup.
It looks like they have recently moved to supporting Spring more
directly/easily, at least that's what I infer from the comment.
So my hope is that a new milestone of Geronimo would include a
newer version of the CXF library and would fix this issue. Do
you guys think that might to be the case? If so, in the
meantime, is there anything I can do that would allow me to
workaround this issue? If not, I'll fall back and try the dummy
ejb method that was mentioned in one of the threads I linked to.
Thanks, Rich