On Jan 6, 2009, at 6:03 PM, Gili wrote:
>
> I used a debugger to walk through the code and as far as I can tell if
> @Provider is missing then the Guice getComponentProvider() is never
> invoked
> in the first place (this is in Jersey revision 1816).
Thanks for doing that, it now confirms what i expected.
> Sounds like a second
> bug in Jersey no?
>
Yes. I think the manner of a fix depends on where we choose to fail on
class initialization. My preference would be that we fix the
annotation class scanner to fail on class loading causing an error for
the config initialization resulting in application failure i.e. that
is the earliest point it can fail for such initialization cases. (In
general initialization of classes should fail on class loading for all
cases.)
I am still pondering what to do about the infrastructure providers.
Having looked at it more, i really want to avoid annotating them with
@Provider so they *do not* get picked up by user-defined
configuration, and we still need to support the "keep on trucking"
approach to the infrastructure providers. So i now think we need to
treat @Provider providers registered by the user different to those
registered by META-INF/service and supplied by Jersey. So i would like
to revert back the multipart readers/writers to not be annotated with
@Provider.
In summary:
1) the user-registered configuration class loading will perform
class initialization and if initialization fails the application will
fail early
before instantiation is attempted;
2) we can improve the reporting of infrastructure providers that
fail to load (a concise warning that also alleviates concerns for those
who do not have an issue and linking to the dependencies
document seems appropriate); and
3) The ResourceConfig implementations should ignore any classes not
annotated with @Provider or @Path. I still need to think
how to do this without breaking compatibility. I am not sure
it is possible.
Paul.
> Gili
>
>
> Paul Sandoz wrote:
>>
>> After some further investigation I realized that my evaluation is
>> wrong. Only when instantiating does a NoClassDefFoundError regardless
>> of the difference in class loading (which is in the process of being
>> fixed).
>>
>> I notice that your GuiceComponentProviderFactory is instantiating the
>> provider class. The registered IoC component provider factory will be
>> asked to instantiate components registered in both cases (@Provider
>> and META-INF/services) and if the provider factory returns null
>> Jersey
>> instantiates. For some reasons your provider factory is instantiating
>> for the case of a class annotated with @Provider but not otherwise,
>> does your code have some logic to check annotations on the classes it
>> instantiates?
>>
>> Paul.
>>
>> On Dec 24, 2008, at 3:10 AM, Gili wrote:
>>
>>>
>>> Here is what I found out:
>>>
>>> - The MultiPart provider fails to initialize because Javamail is
>>> missing.
>>> Glassfish bundles this dependency, whereas Tomcat does not.
>>> - If the MessageBodyReader omits @Provider then no error message
>>> shows up.
>>> The binding fails silently, causing Jersey to issue a confusing
>>> error
>>> message about the MessageBodyReader being missing when in fact it is
>>> not.
>>> - If the MessageBodyReader is annotated using @Provider the
>>> following
>>> exception shows up when the webapp is initialized:
>>>
>>> SEVERE: Exception starting filter warpServletFilter
>>> java.lang.NoClassDefFoundError: javax/mail/MessagingException
>>> at java.lang.Class.getDeclaredConstructors0(Native Method)
>>> at java.lang.Class.privateGetDeclaredConstructors(Class.java:
>>> 2389)
>>> at java.lang.Class.getDeclaredConstructors(Class.java:1836)
>>> at
>>> com
>>> .google
>>> .inject.spi.InjectionPoint.forConstructorOf(InjectionPoint.java:192)
>>> at
>>> com
>>> .google.inject.ConstructorInjector.<init>(ConstructorInjector.java:
>>> 45)
>>> at com.google.inject.InjectorImpl$5.create(InjectorImpl.java:
>>> 728)
>>> at com.google.inject.InjectorImpl$5.create(InjectorImpl.java:
>>> 724)
>>> at
>>> com.google.inject.internal.FailableCache
>>> $1.create(FailableCache.java:
>>> 32)
>>> at
>>> com
>>> .google.inject.internal.ReferenceCache.create(ReferenceCache.java:
>>> 54)
>>> at
>>> com
>>> .google
>>> .inject
>>> .internal
>>> .AbstractReferenceCache.internalCreate(AbstractReferenceCache.java:
>>> 59)
>>> at
>>> com
>>> .google
>>> .inject
>>> .internal.AbstractReferenceCache.get(AbstractReferenceCache.java:
>>> 116)
>>> at
>>> com.google.inject.internal.ReferenceCache.get(ReferenceCache.java:
>>> 28)
>>> at
>>> com.google.inject.internal.FailableCache.get(FailableCache.java:43)
>>> at
>>> com.google.inject.InjectorImpl
>>> $LateBoundConstructor.bind(InjectorImpl.java:431)
>>> at
>>> com.google.inject.ClassBindingImpl.initialize(ClassBindingImpl.java:
>>> 46)
>>> at
>>> com.google.inject.InjectorImpl.initializeBinding(InjectorImpl.java:
>>> 320)
>>> at
>>> com
>>> .google
>>> .inject.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:615)
>>> at
>>> com
>>> .google
>>> .inject
>>> .InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:
>>> 558)
>>> at
>>> com
>>> .google.inject.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:
>>> 168)
>>> at
>>> com.google.inject.InjectorImpl.getBindingOrThrow(InjectorImpl.java:
>>> 128)
>>> at
>>> com.google.inject.InjectorImpl.getBinding(InjectorImpl.java:105)
>>> at
>>> com.google.inject.InjectorImpl.getBinding(InjectorImpl.java:60)
>>> at
>>> com
>>> .sun
>>> .jersey
>>> .spi
>>> .guice
>>> .container
>>> .GuiceComponentProviderFactory
>>> .getComponentProvider(GuiceComponentProviderFactory.java:98)
>>> at
>>> com
>>> .sun
>>> .jersey
>>> .spi
>>> .guice
>>> .container
>>> .GuiceComponentProviderFactory
>>> .getComponentProvider(GuiceComponentProviderFactory.java:87)
>>> at
>>> com
>>> .sun
>>> .jersey
>>> .core
>>> .spi
>>> .component
>>> .ioc
>>> .IoCProviderFactory._getComponentProvider(IoCProviderFactory.java:
>>> 68)
>>> at
>>> com
>>> .sun
>>> .jersey
>>> .core
>>> .spi
>>> .component
>>> .ProviderFactory.getComponentProvider(ProviderFactory.java:
>>> 126)
>>> at
>>> com
>>> .sun
>>> .jersey
>>> .core
>>> .spi.component.ProviderServices.getComponent(ProviderServices.java:
>>> 163)
>>> at
>>> com
>>> .sun
>>> .jersey
>>> .core
>>> .spi
>>> .component
>>> .ProviderServices.getProvidersAndServices(ProviderServices.java:119)
>>> at
>>> com
>>> .sun
>>> .jersey
>>> .core
>>> .spi
>>> .factory.MessageBodyFactory.getProviderMap(MessageBodyFactory.java:
>>> 136)
>>> at
>>> com
>>> .sun
>>> .jersey
>>> .core
>>> .spi.factory.MessageBodyFactory.initReaders(MessageBodyFactory.java:
>>> 110)
>>> at
>>> com
>>> .sun
>>> .jersey
>>> .core.spi.factory.MessageBodyFactory.init(MessageBodyFactory.java:
>>> 105)
>>> at
>>> com
>>> .sun
>>> .jersey
>>> .server
>>> .impl
>>> .application.WebApplicationImpl.initiate(WebApplicationImpl.java:
>>> 462)
>>> at
>>> com
>>> .sun
>>> .jersey
>>> .spi
>>> .guice.container.servlet.GuiceServlet.initiate(GuiceServlet.java:
>>> 47)
>>> at
>>> com
>>> .sun
>>> .jersey
>>> .spi.container.servlet.ServletContainer.load(ServletContainer.java:
>>> 540)
>>> at
>>> com
>>> .sun
>>> .jersey
>>> .spi.container.servlet.ServletContainer.init(ServletContainer.java:
>>> 207)
>>> at
>>> com
>>> .wideplay
>>> .warp.servlet.ServletDefinition.init(ServletDefinition.java:
>>> 50)
>>> at
>>> com
>>> .wideplay
>>> .warp
>>> .servlet.ManagedServletPipeline.init(ManagedServletPipeline.java:31)
>>> at
>>> com
>>> .wideplay
>>> .warp
>>> .servlet
>>> .ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:38)
>>> at com.wideplay.warp.servlet.WebFilter.init(WebFilter.java:70)
>>> at
>>> org
>>> .apache
>>> .catalina
>>> .core
>>> .ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:
>>> 275)
>>> at
>>> org
>>> .apache
>>> .catalina
>>> .core
>>> .ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:
>>> 397)
>>> at
>>> org
>>> .apache
>>> .catalina
>>> .core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:
>>> 108)
>>> at
>>> org
>>> .apache
>>> .catalina.core.StandardContext.filterStart(StandardContext.java:
>>> 3709)
>>> at
>>> org.apache.catalina.core.StandardContext.start(StandardContext.java:
>>> 4363)
>>> at
>>> org
>>> .apache
>>> .catalina.core.ContainerBase.addChildInternal(ContainerBase.java:
>>> 791)
>>> at
>>> org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:
>>> 771)
>>> at
>>> org.apache.catalina.core.StandardHost.addChild(StandardHost.java:
>>> 525)
>>> at
>>> org
>>> .apache
>>> .catalina.startup.HostConfig.deployDescriptor(HostConfig.java:
>>> 627)
>>> at
>>> org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:
>>> 511)
>>> at
>>> org.apache.catalina.startup.HostConfig.check(HostConfig.java:1231)
>>> 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:597)
>>> at
>>> org
>>> .apache
>>> .tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:297)
>>> at
>>> com
>>> .sun
>>> .jmx
>>> .interceptor
>>> .DefaultMBeanServerInterceptor
>>> .invoke(DefaultMBeanServerInterceptor.java:836)
>>> at
>>> com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:
>>> 761)
>>> at
>>> org
>>> .apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:
>>> 1471)
>>> at
>>> org
>>> .apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:
>>> 824)
>>> at
>>> org
>>> .apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:
>>> 350)
>>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:
>>> 617)
>>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:
>>> 717)
>>> at
>>> org
>>> .apache
>>> .catalina
>>> .core
>>> .ApplicationFilterChain
>>> .internalDoFilter(ApplicationFilterChain.java:
>>> 290)
>>> at
>>> org
>>> .apache
>>> .catalina
>>> .core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
>>> 206)
>>> at
>>> org
>>> .apache
>>> .catalina
>>> .core.StandardWrapperValve.invoke(StandardWrapperValve.java:
>>> 233)
>>> at
>>> org
>>> .apache
>>> .catalina
>>> .core.StandardContextValve.invoke(StandardContextValve.java:
>>> 191)
>>> at
>>> org
>>> .apache
>>> .catalina
>>> .authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
>>> at
>>> org
>>> .apache
>>> .catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
>>> at
>>> org
>>> .apache
>>> .catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
>>> at
>>> org
>>> .apache
>>> .catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:
>>> 109)
>>> at
>>> org
>>> .apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:
>>> 286)
>>> at
>>> org
>>> .apache.coyote.http11.Http11Processor.process(Http11Processor.java:
>>> 845)
>>> at
>>> org.apache.coyote.http11.Http11Protocol
>>> $Http11ConnectionHandler.process(Http11Protocol.java:583)
>>> at
>>> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:
>>> 447)
>>> at java.lang.Thread.run(Thread.java:619)
>>> Caused by: java.lang.ClassNotFoundException:
>>> javax.mail.MessagingException
>>> at
>>> org
>>> .apache
>>> .catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:
>>> 1387)
>>> at
>>> org
>>> .apache
>>> .catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:
>>> 1233)
>>> at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:
>>> 320)
>>> ... 75 more
>>>
>>> I filed two bug reports:
>>> https://jersey.dev.java.net/issues/show_bug.cgi?id=171
>>> https://jersey.dev.java.net/issues/show_bug.cgi?id=172
>>>
>>> Gili
>>>
>>>
>>> Gili wrote:
>>>>
>>>> It's taking me forever to debug this, but in the process of
>>>> troubleshooting I noticed that MultiPartReader isn't annotated with
>>>> @Provider as required according to MessageBodyReader's
>>>> specification. The
>>>> Javadoc reads "To add a MessageBodyReader implementation, annotate
>>>> the
>>>> implementation class with @Provider". Could this be it? It still
>>>> doesn't
>>>> explain why this works under Glassfish without the annotation.
>>>>
>>>> Gili
>>>>
>>>>
>>>> Gili wrote:
>>>>>
>>>>> I took my existing webapp, moved from Glassfish v2 to Tomcat and
>>>>> all of a
>>>>> sudden I get:
>>>>>
>>>>> SEVERE: A message body reader for Java type, class
>>>>> com.sun.jersey.multipart.MultiPart, and MIME media type,
>>>>> multipart/
>>>>> mixed,
>>>>> was not found
>>>>>
>>>>> I'm guessing that Jersey provider scanning is failing under Tomcat
>>>>> for
>>>>> some reason...? Paul, Craig can you guys confirm this?
>>>>>
>>>>> Thanks,
>>>>> Gili
>>>>>
>>>>
>>>>
>>>
>>> --
>>> View this message in context:
>>> http://n2.nabble.com/Jersey-provider-detection-fails-under-Tomcat--tp1688690p1696750.html
>>> Sent from the Jersey mailing list archive at Nabble.com.
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
>>> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
>> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>>
>>
>>
>
> --
> View this message in context: http://n2.nabble.com/Jersey-provider-detection-fails-under-Tomcat--tp1688690p2118383.html
> Sent from the Jersey mailing list archive at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>