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/

Reply via email to