cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sergey Beryozkin <sberyoz...@gmail.com>
Subject Re: Why is CXF creating a new instance of my controller for each request?
Date Fri, 05 Aug 2016 10:04:40 GMT
Hi David

By default JAX-RS assumes a service lifecycle is per-request.
When one uses CXFServlet directly it is nearly always a singleton unless 
a user specifies a non-singleton scope in Spring.

So I'd need to configure it somehow at the Tomee level, I've asked at 
#openejb, here is what Romain (@rmannibucau) said:

Either disable a Tomee jaxrs subsystem classpath scanning to avoid a 
double scanning
or
use JAX-RS Application.getSingleton
or
@ApplicationScoped @javax.ejb.Singleton and @javax.inject.Singleton (but 
this one is a bit slower casue the lookup is done per invocation where 
@AppScoped is cached)


By the way, I saw at "#openejb" a user who I thought might've been 
yourself. If it is indeed the case then please talk to Romain who is the 
TomEE expert who can always help.

Cheers, Sergey

On 04/08/16 18:35, KARR, DAVID wrote:
> I'm building a new CXF/JAX-RS/Spring app based on one that I built a few years ago, but
with the latest versions of CXF and Spring (3.1.7 and 4.3.2, respectively).
>
> I finally thought I had gotten my controller, service, and DAO all wired together, but
then I noticed that when I got into the controller method after handling a web request, the
service object was null, even though I saw the setter breakpoint being hit.  I then discovered
that CXF appears to be creating a new instance of the controller for every request, and the
controller instance that it uses isn't wired up.
>
> I'm running this in TomEE 7.0.1.  The old app was running in WebLogic.
>
> When I hit the breakpoint in the controller constructor after sending the request, I
see the following stacktrace:
>
> ---------------
> WebProjController.<init>() line: 44	
> NativeConstructorAccessorImpl.newInstance0(Constructor<?>, Object[]) line: not
available [native method]	
> NativeConstructorAccessorImpl.newInstance(Object[]) line: not available	
> DelegatingConstructorAccessorImpl.newInstance(Object[]) line: not available	
> Constructor<T>.newInstance(Object...) line: not available	
> CdiResourceProvider$DefaultBeanCreator.newInstance() line: 315	
> CdiResourceProvider$DefaultBeanCreator.create() line: 321	
> OpenEJBPerRequestPojoResourceProvider(CdiResourceProvider).getInstance(Message) line:
171	
> CxfRsHttpListener.getServiceObject(Message) line: 1036	
> CxfRsHttpListener.access$200(CxfRsHttpListener, Message) line: 142	
> CxfRsHttpListener$4.getServiceObject(Message) line: 909	
> CxfRsHttpListener$4(AbstractValidationInterceptor).handleMessage(Message) line: 59	
> PhaseInterceptorChain.doIntercept(Message) line: 308	
> ChainInitiationObserver.onMessage(Message) line: 121	
> ---------------
>
> Any idea how to make this use the existing Spring singleton instead of creating a new
instance?
>


-- 
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Mime
View raw message