Dave Riseley created CXF-9117:
---------------------------------
Summary: CXF 4.1.1 cxf-rt-ws-security fails if JCache is not on
the classpath
Key: CXF-9117
URL: https://issues.apache.org/jira/browse/CXF-9117
Project: CXF
Issue Type: Bug
Components: WS-* Components
Affects Versions: 4.1.1
Environment: Spring Boot 3.4.3 / Java 21
Reporter: Dave Riseley
CXF-8765 (released in 4.1.1) introduced the option to remove EHCache as
dependency, but has the side effect of forcing a dependency on JCache, so our
CXF application fails to start as we don't have JCache available (and don't
want to add it)
This is an abstract of the stack trace:
{{java.lang.NoClassDefFoundError: javax/cache/configuration/Configuration}}
{{ at
org.apache.cxf.ws.security.tokenstore.TokenStoreFactory.newInstance(TokenStoreFactory.java:35)}}
{{ at
org.apache.cxf.ws.security.tokenstore.TokenStoreUtils.getTokenStore(TokenStoreUtils.java:43)}}
{{ at
org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.getCallback(WSS4JInInterceptor.java:688)}}
{{ at
org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.getCallback(WSS4JInInterceptor.java:628)}}
{{ at
org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessageInternal(WSS4JInInterceptor.java:271)}}
{{ at
org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:213)}}
{{ at
org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:93)}}
{{ at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)}}
{{ at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)}}
{{ at
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:267)}}
{{ at
org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:238)}}
{{ at
org.apache.cxf.transport.http_jetty.JettyHTTPHandler.service(JettyHTTPHandler.java:97)}}
{{ at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)}}
{{ at
org.eclipse.jetty.ee10.servlet.ServletHolder.handle(ServletHolder.java:736)}}
{{ at
org.eclipse.jetty.ee10.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1619)}}
{{ at
org.eclipse.jetty.ee10.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1552)}}
{{ at
org.eclipse.jetty.ee10.servlet.ServletChannel.dispatch(ServletChannel.java:819)}}
{{ at
org.eclipse.jetty.ee10.servlet.ServletChannel.handle(ServletChannel.java:436)}}
{{ at
org.eclipse.jetty.ee10.servlet.ServletHandler.handle(ServletHandler.java:469)}}
{{ at
org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1060)}}
From
[https://github.com/apache/cxf/blob/cxf-4.1.1/rt/ws/security/src/main/java/org/apache/cxf/ws/security/tokenstore/TokenStoreFactory.java]
{{ if (WSS4JCacheUtil.isEhCacheInstalled()) {}}
{{ return new EHCacheTokenStoreFactory();}}
{{ } else if (JCacheUtils.isJCacheInstalled()) {}}
{{ return new JCacheTokenStoreFactory();}}
{{ } else {}}
{{ return new MemoryTokenStoreFactory();}}
{{ }}}
Looking at
[https://github.com/apache/cxf/blob/main/rt/ws/security/src/main/java/org/apache/cxf/ws/security/utils/JCacheUtils.java]
it attempts to check for JCache via reflection - but also has imports for the
jcache classes:
{{import javax.cache.Cache;}}
{{import javax.cache.CacheManager;}}
{{import javax.cache.configuration.MutableConfiguration;}}
which causes the NoClassDefFoundError
I think moving the JCache check to WSS4JCacheUtil would fix the issue?
For now we will remain on v4.1.0
--
This message was sent by Atlassian Jira
(v8.20.10#820010)