Hi Dan,
Thanks for your clarification.
I'll revert my change, and Willem's 1100162 commit already store
application context classloader for spring bus and your 1087406 commit
already set correct application context classloader which retrieved
from SpringBus or BlueprintBus for MessageObservers, so we should be
fine with SpringBus or BlueprintBus with you two's change . But I'm
not sure if it's ok when we use java code directly to publish
endpoint, no SpringBus or BlueprintBus get involved at all in this
case and I think
bus.getExtension(ClassLoader.class);
would be null(is my assumption correct?) and so we have no chance to
reset TCCL with correct classloader, that's the major reason why I set
TCCL in AbstractInvoker as there's the place I can get ServiceObject's
classloader. Though in OSGi container we mostly publish webservice
endpoint through spring-dm/blueprint per the nature that OSGi bundle
isn't a standalone process, but I'm still a lit bit concern about the
case that not use SpringBus nor BlueprintBus.
Regards
Freeman
On 2011-5-11, at 上午7:55, Daniel Kulp wrote:
I have to -1 this commit as it breaks a few use cases.
Primarily, the STS server we now have as part of the CXF bundle.
In the case
of the STS, the classloader that loads the STS class will likely be
the CXF
bundle classloader, not the application context. However, the user
code will
likely need to have the thread context loader set to the application
contexts
loader in order to get all the security information and
credentials. There
are other similar issues. In all the cases, the TCCL should be
set to t he
class loader for the Application (likely from the ApplicationContext
for
Spring). It should be set prior to calling the chain,, likely by the
transport itself or the message listener. After that, it
shouldn't need to
be reset. Anyway, now for both Spring and Blueprint, the proper
classloader is saved as bus.getExtension(ClassLoader.class) and we
should
make sure we always use that.
Dan
On Monday, May 09, 2011 4:54:00 AM ff...@apache.org wrote:
Author: ffang
Date: Mon May 9 08:54:00 2011
New Revision: 1100921
URL: http://svn.apache.org/viewvc?rev=1100921&view=rev
Log:
[CXF-3503]CXF should set the TCCL to the one of the service being
invoked
prior any invocation
Modified:
cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/
AbstractInv
oker.java
Modified:
cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/
AbstractInv
oker.java URL:
http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cx
f/service/invoker/AbstractInvoker.java?
rev=1100921&r1=1100920&r2=1100921&vi
ew=diff
=
=
=
=
=
=====================================================================
==== ---
cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/
AbstractInv
oker.java (original) +++
cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/invoker/
AbstractInv
oker.java Mon May 9 08:54:00 2011 @@ -80,7 +80,9 @@ public
abstract class
AbstractInvoker im
protected Object invoke(Exchange exchange, final Object
serviceObject,
Method m, List<Object> params) { Object res;
+ ClassLoader oldCL =
Thread.currentThread().getContextClassLoader(); try {
+
Thread
.currentThread().setContextClassLoader(serviceObject.getClass().getC
lassLoader()); Object[] paramArray = new Object[]{};
if (params != null) {
paramArray = params.toArray();
@@ -131,6 +133,8 @@ public abstract class AbstractInvoker im
checkSuspendedInvocation(exchange, serviceObject, m,
params,
e); exchange.getInMessage().put(FaultMode.class,
FaultMode.UNCHECKED_APPLICATION_FAULT); throw createFault(e, m,
params,
false);
+ } finally {
+ Thread.currentThread().setContextClassLoader(oldCL);
}
}
--
Daniel Kulp
dk...@apache.org
http://dankulp.com/blog
Talend - http://www.talend.com
---------------------------------------------
Freeman Fang
FuseSource
Email:ff...@fusesource.com
Web: fusesource.com
Twitter: freemanfang
Blog: http://freemanfang.blogspot.com
Connect at CamelOne May 24-26
The Open Source Integration Conference