From ccf74136eb5ecad1f5f3b89d52cd88a1fe496c9d Mon Sep 17 00:00:00 2001 From: Jim Ma Date: Thu, 24 Oct 2024 16:02:55 +0800 Subject: [PATCH] [JBWS-4430]:Fix IllegalStateException in CXF interceptor when it tries to access CDI bean --- .../AbstractTCCLPhaseInterceptor.java | 54 +++++++++++++++++++ .../jaxws/cxf/jbws4430/CDIOutInterceptor.java | 37 +++++++++++++ .../test/ws/jaxws/cxf/jbws4430/HelloBean.java | 2 + .../jaxws/cxf/jbws4430/JBWS4430TestCase.java | 4 +- 4 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 modules/server/src/main/java/org/jboss/wsf/stack/cxf/interceptor/AbstractTCCLPhaseInterceptor.java create mode 100644 modules/testsuite/cxf-tests/src/test/java/org/jboss/test/ws/jaxws/cxf/jbws4430/CDIOutInterceptor.java diff --git a/modules/server/src/main/java/org/jboss/wsf/stack/cxf/interceptor/AbstractTCCLPhaseInterceptor.java b/modules/server/src/main/java/org/jboss/wsf/stack/cxf/interceptor/AbstractTCCLPhaseInterceptor.java new file mode 100644 index 000000000..e62e3a66c --- /dev/null +++ b/modules/server/src/main/java/org/jboss/wsf/stack/cxf/interceptor/AbstractTCCLPhaseInterceptor.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.jboss.wsf.stack.cxf.interceptor; + +import org.apache.cxf.common.classloader.ClassLoaderUtils; +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.AbstractPhaseInterceptor; + +public abstract class AbstractTCCLPhaseInterceptor extends AbstractPhaseInterceptor { + public AbstractTCCLPhaseInterceptor(String phase) { + super(null, phase, false); + } + + public AbstractTCCLPhaseInterceptor(String i, String p) { + super(i, p, false); + } + + public AbstractTCCLPhaseInterceptor(String phase, boolean uniqueId) { + super(null, phase, uniqueId); + } + + public AbstractTCCLPhaseInterceptor(String i, String p, boolean uniqueId) { + super(i,p, uniqueId); + } + + @Override + public void handleMessage(T message) throws Fault { + ClassLoaderUtils.ClassLoaderHolder origLoader = null; + try { + origLoader = ClassLoaderUtils.setThreadContextClassloader(this.getClass().getClassLoader()); + handleMessageWithTCCL(message); + } finally { + origLoader.reset(); + } + } + public abstract void handleMessageWithTCCL(T message) throws Fault; +} diff --git a/modules/testsuite/cxf-tests/src/test/java/org/jboss/test/ws/jaxws/cxf/jbws4430/CDIOutInterceptor.java b/modules/testsuite/cxf-tests/src/test/java/org/jboss/test/ws/jaxws/cxf/jbws4430/CDIOutInterceptor.java new file mode 100644 index 000000000..41e356799 --- /dev/null +++ b/modules/testsuite/cxf-tests/src/test/java/org/jboss/test/ws/jaxws/cxf/jbws4430/CDIOutInterceptor.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.jboss.test.ws.jaxws.cxf.jbws4430; +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.message.Message; +import org.apache.cxf.message.MessageUtils; +import org.apache.cxf.phase.Phase; +import org.jboss.wsf.stack.cxf.interceptor.AbstractTCCLPhaseInterceptor; + +public class CDIOutInterceptor extends AbstractTCCLPhaseInterceptor { + public CDIOutInterceptor() { + super(Phase.PRE_STREAM); + } + + @Override + public void handleMessageWithTCCL(Message message) throws Fault { + if (!MessageUtils.isRequestor(message)) { + DelegateBean bean = new DelegateBean(); + } + } +} diff --git a/modules/testsuite/cxf-tests/src/test/java/org/jboss/test/ws/jaxws/cxf/jbws4430/HelloBean.java b/modules/testsuite/cxf-tests/src/test/java/org/jboss/test/ws/jaxws/cxf/jbws4430/HelloBean.java index a3f657ad3..ed1ca7aa3 100644 --- a/modules/testsuite/cxf-tests/src/test/java/org/jboss/test/ws/jaxws/cxf/jbws4430/HelloBean.java +++ b/modules/testsuite/cxf-tests/src/test/java/org/jboss/test/ws/jaxws/cxf/jbws4430/HelloBean.java @@ -19,10 +19,12 @@ package org.jboss.test.ws.jaxws.cxf.jbws4430; import jakarta.jws.HandlerChain; +import org.apache.cxf.interceptor.OutInterceptors; @jakarta.jws.WebService(targetNamespace = "http://test.ws.jboss.org/", wsdlLocation = "WEB-INF/wsdl/HelloWorld.wsdl") @HandlerChain(file = "/handlers.xml") +@OutInterceptors(interceptors = {"org.jboss.test.ws.jaxws.cxf.jbws4430.CDIOutInterceptor"}) public class HelloBean { public HelloBean() { } diff --git a/modules/testsuite/cxf-tests/src/test/java/org/jboss/test/ws/jaxws/cxf/jbws4430/JBWS4430TestCase.java b/modules/testsuite/cxf-tests/src/test/java/org/jboss/test/ws/jaxws/cxf/jbws4430/JBWS4430TestCase.java index c14868ec5..43fc846ac 100644 --- a/modules/testsuite/cxf-tests/src/test/java/org/jboss/test/ws/jaxws/cxf/jbws4430/JBWS4430TestCase.java +++ b/modules/testsuite/cxf-tests/src/test/java/org/jboss/test/ws/jaxws/cxf/jbws4430/JBWS4430TestCase.java @@ -47,8 +47,8 @@ public class JBWS4430TestCase extends JBossWSTest { public static WebArchive createDeployment() { WebArchive archive = ShrinkWrap.create(WebArchive.class, DEP + ".war"); archive.setManifest(new StringAsset("Manifest-Version: 1.0\n" - + "Dependencies: org.apache.cxf\n")) - .addClasses(HelloBean.class, DelegateBean.class, EmptyBean.class, LoggingHandler.class) + + "Dependencies: org.jboss.ws.cxf.jbossws-cxf-server\n")) + .addClasses(HelloBean.class, DelegateBean.class, EmptyBean.class, CDIOutInterceptor.class, LoggingHandler.class) .addAsWebInfResource(new File(JBossWSTestHelper.getTestResourcesDir() + "/jaxws/cxf/jbws4430/WEB-INF/wsdl/HelloWorld.wsdl"), "wsdl/HelloWorld.wsdl") .add(new FileAsset(new File(JBossWSTestHelper.getTestResourcesDir() + "/jaxws/cxf/jbws4430/handlers.xml")), "WEB-INF/classes/handlers.xml") .setWebXML(new File(JBossWSTestHelper.getTestResourcesDir() + "/jaxws/cxf/jbws4430/WEB-INF/web.xml"));