I single-stepped through the service creation, and I didn't spot any
capturing of a class loader by the bus initialization. I'm probably
being dense.

On Mon, Dec 21, 2015 at 6:47 PM, Benson Margulies <[email protected]> wrote:
> Definitely the HTTP transport.
>
> ResourceDelegatingBundleClassLoader{bundle=org.apache.cxf.cxf-rt-transports-http
> [110],parent=BundleClassLoader{bundle=org.ops4j.pax.web.pax-web-jetty
> [221],parent=null}}
>
> Here's the whole backtrace.
>
> "qtp1894429215-109@4540" prio=5 tid=0x6d nid=NA runnable
>   java.lang.Thread.State: RUNNABLE
>  at 
> com.basistech.ws.common.api.options.OptionsValidator.validate(OptionsValidator.java:36)
>  at 
> com.basistech.ws.common.api.options.ProcessingOptions$Builder.setOptions(ProcessingOptions.java:124)
>  at 
> com.basistech.ws.frontend.service.AbstractRaasRsService.getProcessingOptions(AbstractRaasRsService.java:756)
>  at 
> com.basistech.ws.frontend.service.AbstractRaasRsService.processRequest(AbstractRaasRsService.java:582)
>  at 
> com.basistech.ws.frontend.service.AbstractRaasRsService.processHelper(AbstractRaasRsService.java:210)
>  at 
> com.basistech.ws.frontend.service.RaasRsEntityService.runEntityExtraction(RaasRsEntityService.java:108)
>  at 
> sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
>  at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>  at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>  at java.lang.reflect.Method.invoke(Method.java:497)
>  at 
> org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:180)
>  at 
> org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
>  at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:200)
>  at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:99)
>  at 
> org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59)
>  at 
> org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96)
>  at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
>  - locked <0x254e> (a org.apache.cxf.phase.PhaseInterceptorChain)
>  at 
> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
>  at 
> org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:251)
>  at 
> org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)
>  at 
> org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)
>  at 
> org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)
>  at 
> org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:171)
>  at 
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:293)
>  at 
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:212)
>  at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
>  at 
> org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:268)
>  at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:808)
>  at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587)
>  at 
> org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:70)
>  at 
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
>  at 
> org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)
>  at 
> org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
>  at 
> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
>  at 
> org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:271)
>  at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
>  at 
> org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
>  at 
> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
>  at 
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
>  at 
> org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:80)
>  at 
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
>  at org.eclipse.jetty.server.Server.handle(Server.java:497)
>  at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
>  at 
> org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
>  at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
>  at 
> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
>  at 
> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
>  at java.lang.Thread.run(Thread.java:745)
>
> On Mon, Dec 21, 2015 at 6:40 PM, Benson Margulies <[email protected]> 
> wrote:
>> On Mon, Dec 21, 2015 at 3:54 PM, Daniel Kulp <[email protected]> wrote:
>>> Benson,
>>>
>>> Can you walk back through the stack a bit…  I BELIEVE that pax-web should 
>>> be invoking one of our servlets which should then be getting into the 
>>> ServletController.  In the invoke method in there, it grabs the Bus from 
>>> the destination and sets the TCCL to the ClassLoader it has recorded.  That 
>>> SHOULD be the class loader for the bundle where the service is started.   
>>> Can you check if that’s the pathway it going through?   If so, then the 
>>> question is why is the class loader NOT be set appropriately.   What bus is 
>>> being used?   Where is that Bus created?   Etc….
>>
>> Dan,
>>
>> Here's what I know, and then I'll need to do some research.
>>
>> Situation:
>>
>> Karaf 4.0.2, CXF 3.1.4. JAX-RS services registered with the service
>> factory in a DS @Activate method. Code that registers the service is
>> below at  [1], so if there's an API to pass in a ClassLoader, I was
>> ignorant and failed to call it. I have whatever bus sprung itself into
>> existence in the code below. Perhaps I should make a bus explicitly
>> and shove a class loader into it?
>>
>> Observation: when a resource method is called, TCCL is not me, leading
>> to all the HV trouble. I think it might be the HTTP transport bundle,
>> but Karaf logging may have mislead me.
>>
>> I will go now and set a breakpoint and report back with a more
>> reliable indication.
>>
>>
>> [1]:
>>
>> JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
>> sf.setProvider(new JacksonJaxbJsonProvider(JsonUtils.getObjectMapper(),
>>         JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS));
>> sf.setProvider(new JsonExceptionMapper());
>> sf.setProvider(new WebApplicationExceptionMapper());
>> sf.setProvider(new GenericExceptionMapper());
>> sf.setServiceBeans(Collections.singletonList(this));
>>
>> String url = urlPrefix + resourcePath;
>> LOG.info(String.format("%s at %s", getClass().getName(), url));
>> sf.setAddress(url);
>> server = sf.create();
>>
>>
>>>
>>> Dan
>>>
>>>
>>>
>>>
>>>
>>>> On Dec 21, 2015, at 3:35 PM, Benson Margulies <[email protected]> 
>>>> wrote:
>>>>
>>>> Working with Gunnar, I've finally gotten a complete picture of the
>>>> situation, and a somewhat general question has come up.
>>>>
>>>> When pax-web calls CXF which in turn calls a JAX-RS resource class,
>>>> the TCCL is the CXF http transport bundle class loader. Is there some
>>>> reason not to set it to a class loader associated with the resource
>>>> class?
>>>>
>>>> The trouble with HibernateValidation is this: way down in HV, there's
>>>> a call to ExpressionFactory.newInstance() from javax.el. That's an
>>>> old-fashioned SPI that does not have an overload that takes a
>>>> ClassLoader. So, even though HV has a class loader option in its
>>>> configuration meant to ensure the findability of resources, it does
>>>> not avail. (Unless HV set the TCCL, which its authors are not happy
>>>> about.) I'm working with them on an API that will allow the user of HV
>>>> to make their own ExpressionFactory with the TCCL set however they
>>>> like. However, it did occur to me that a different TCCL in CXF
>>>> invoking JAX-RS would have avoided all this.
>>>
>>> --
>>> Daniel Kulp
>>> [email protected] - http://dankulp.com/blog
>>> Talend Community Coder - http://coders.talend.com
>>>

Reply via email to