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)

Reply via email to