You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSO2 APIM 4.1.0中APIMgtGatewayJWTGeneratorImpl配置读取及报错问题

WSO2 API Manager 2.6.0 升级至4.1.0:自定义JWT生成器配置获取问题

我将WSO2 API Manager从2.6.0版本升级至4.1.0版本,旧版本中仅使用JWTGenerator生成器类。在继承JWTGenerator的类中,曾通过以下Java代码从api-manager.xml获取自定义配置:

APIManagerConfiguration config = ServiceReferenceHolder.getInstance().getAPIManagerConfigurationService().getAPIManagerConfiguration();
String jwtExpirySetting = config.getFirstProperty(JWT_EXPIRY_CONFIG);

提出的问题

  • 问题1:在4.1.0版本中是否可以添加自定义配置?
  • 问题2:在继承APIMgtGatewayJWTGeneratorImpl的生成器中,如何通过Java代码从deployment.toml获取网关令牌缓存及JWT过期时间相关配置?

遇到的错误

当我在自定义生成器(com.carus.api.gateway.JwtTokenGenerator)中添加上述ServiceReferenceHolder相关代码后,请求API Manager时日志(wso2carbon.log)中出现找不到ServiceReferenceHolder类的错误:

TID: [-1234] [] [2022-10-03 13:09:19,097] ERROR {org.wso2.carbon.apimgt.impl.jwt.JWTValidatorImpl} - Error while parsing JWT org.apache.http.client.ClientProtocolException: URI does not specify a valid host name: https:9443/oauth2/jwks
    at org.apache.http.impl.client.CloseableHttpClient.determineTarget(CloseableHttpClient.java:95)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
    at org.wso2.carbon.apimgt.impl.utils.JWTUtil.retrieveJWKSConfiguration_aroundBody0(JWTUtil.java:58)
    at org.wso2.carbon.apimgt.impl.utils.JWTUtil.retrieveJWKSConfiguration(JWTUtil.java:52)
    at org.wso2.carbon.apimgt.impl.jwt.JWTValidatorImpl.retrieveJWKSet_aroundBody22(JWTValidatorImpl.java:227)
    at org.wso2.carbon.apimgt.impl.jwt.JWTValidatorImpl.retrieveJWKSet(JWTValidatorImpl.java:224)
    at org.wso2.carbon.apimgt.impl.jwt.JWTValidatorImpl.validateSignature_aroundBody8(JWTValidatorImpl.java:145)
    at org.wso2.carbon.apimgt.impl.jwt.JWTValidatorImpl.validateSignature(JWTValidatorImpl.java:135)
    at org.wso2.carbon.apimgt.impl.jwt.JWTValidatorImpl.validateToken_aroundBody0(JWTValidatorImpl.java:62)
    at org.wso2.carbon.apimgt.impl.jwt.JWTValidatorImpl.validateToken(JWTValidatorImpl.java:57)
    at org.wso2.carbon.apimgt.impl.jwt.JWTValidationServiceImpl.validateJWTToken_aroundBody0(JWTValidationServiceImpl.java:44)
    at org.wso2.carbon.apimgt.impl.jwt.JWTValidationServiceImpl.validateJWTToken(JWTValidationServiceImpl.java:36)
    at org.wso2.carbon.apimgt.gateway.handlers.security.jwt.JWTValidator.getJwtValidationInfo_aroundBody32(JWTValidator.java:691)
    at org.wso2.carbon.apimgt.gateway.handlers.security.jwt.JWTValidator.getJwtValidationInfo(JWTValidator.java:659)
    at org.wso2.carbon.apimgt.gateway.handlers.security.jwt.JWTValidator.authenticate_aroundBody0(JWTValidator.java:174)
    at org.wso2.carbon.apimgt.gateway.handlers.security.jwt.JWTValidator.authenticate(JWTValidator.java:142)
    at org.wso2.carbon.apimgt.gateway.handlers.security.oauth.OAuthAuthenticator.authenticate_aroundBody4(OAuthAuthenticator.java:301)
    at org.wso2.carbon.apimgt.gateway.handlers.security.oauth.OAuthAuthenticator.authenticate(OAuthAuthenticator.java:111)
    at org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler.isAuthenticate_aroundBody56(APIAuthenticationHandler.java:522)
    at org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler.isAuthenticate(APIAuthenticationHandler.java:516)
    at org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler.handleRequest_aroundBody46(APIAuthenticationHandler.java:402)
    at org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler.handleRequest(APIAuthenticationHandler.java:353)
    at org.apache.synapse.api.API.process(API.java:403)
    at org.apache.synapse.api.AbstractApiHandler.apiProcessNonDefaultStrategy(AbstractApiHandler.java:107)
    at org.apache.synapse.api.AbstractApiHandler.identifyAPI(AbstractApiHandler.java:127)
    at org.apache.synapse.api.AbstractApiHandler.dispatchToAPI(AbstractApiHandler.java:59)
    at org.apache.synapse.api.rest.RestRequestHandler.dispatchToAPI(RestRequestHandler.java:90)
    at org.apache.synapse.api.rest.RestRequestHandler.process(RestRequestHandler.java:76)
    at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:54)
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:344)
    at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:101)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
    at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:376)
    at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:190)
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:829)

TID: [-1234] [] [2022-10-03 13:09:19,307]  INFO {org.wso2.carbon.apimgt.keymgt.handlers.DefaultKeyValidationHandler} - org.wso2.carbon.apimgt.keymgt.handlers.DefaultKeyValidationHandler Initialised
TID: [-1234] [] [2022-10-03 13:09:19,367] ERROR {org.apache.axis2.transport.base.threads.NativeWorkerPool} - Uncaught exception java.lang.NoClassDefFoundError: org/wso2/carbon/apimgt/impl/internal/ServiceReferenceHolder
    at com.carus.api.gateway.JwtTokenGenerator.getJwtEpiryMillis(JwtTokenGenerator.java:45)
    at com.carus.api.gateway.JwtTokenGenerator.populateStandardClaims(JwtTokenGenerator.java:87)
    at org.wso2.carbon.apimgt.common.gateway.jwtgenerator.AbstractAPIMgtGatewayJWTGenerator.buildBody(AbstractAPIMgtGatewayJWTGenerator.java:153)
    at org.wso2.carbon.apimgt.common.gateway.jwtgenerator.AbstractAPIMgtGatewayJWTGenerator.generateToken(AbstractAPIMgtGatewayJWTGenerator.java:77)
    at org.wso2.carbon.apimgt.gateway.handlers.security.jwt.JWTValidator.generateAndRetrieveJWTToken_aroundBody4(JWTValidator.java:290)
    at org.wso2.carbon.apimgt.gateway.handlers.security.jwt.JWTValidator.generateAndRetrieveJWTToken(JWTValidator.java:270)
    at org.wso2.carbon.apimgt.gateway.handlers.security.jwt.JWTValidator.authenticate_aroundBody0(JWTValidator.java:221)
    at org.wso2.carbon.apimgt.gateway.handlers.security.jwt.JWTValidator.authenticate(JWTValidator.java:142)
    at org.wso2.carbon.apimgt.gateway.handlers.security.oauth.OAuthAuthenticator.authenticate_aroundBody4(OAuthAuthenticator.java:301)
    at org.wso2.carbon.apimgt.gateway.handlers.security.oauth.OAuthAuthenticator.authenticate(OAuthAuthenticator.java:111)
    at org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler.isAuthenticate_aroundBody56(APIAuthenticationHandler.java:522)
    at org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler.isAuthenticate(APIAuthenticationHandler.java:516)
    at org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler.handleRequest_aroundBody46(APIAuthenticationHandler.java:402)
    at org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler.handleRequest(APIAuthenticationHandler.java:353)
    at org.apache.synapse.api.API.process(API.java:403)
    at org.apache.synapse.api.AbstractApiHandler.apiProcessNonDefaultStrategy(AbstractApiHandler.java:107)
    at org.apache.synapse.api.AbstractApiHandler.identifyAPI(AbstractApiHandler.java:127)
    at org.apache.synapse.api.AbstractApiHandler.dispatchToAPI(AbstractApiHandler.java:59)
    at org.apache.synapse.api.rest.RestRequestHandler.dispatchToAPI(RestRequestHandler.java:90)
    at org.apache.synapse.api.rest.RestRequestHandler.process(RestRequestHandler.java:76)
    at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:54)
    at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:344)
    at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:101)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
    at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:376)
    at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:190)
    at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.ClassNotFoundException: org.wso2.carbon.apimgt.impl.internal.ServiceReferenceHolder cannot be found by JwtTokenGenerator_2.0.0
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:512)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:423)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:415)
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:155)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    ... 30 more

核心问题

如何通过APIMgtGatewayJWTGeneratorImpl获取所需配置?


解决方案

问题1:4.1.0版本支持自定义配置

完全可以添加自定义配置,4.1.0版本已将配置中心从api-manager.xml迁移至deployment.toml,可直接在该文件中添加自定义配置项。

问题2:从deployment.toml获取配置的正确方式

WSO2 APIM 4.x版本中,ServiceReferenceHolder属于后端业务模块(org.wso2.carbon.apimgt.impl),网关侧的自定义JWT生成器无法直接访问该类,这是触发ClassNotFoundException的根本原因。需使用网关侧提供的配置读取工具:

  1. 添加依赖
    确保自定义JWT生成器项目中包含以下适配4.1.0版本的依赖:
<dependency>
    <groupId>org.wso2.carbon.apimgt</groupId>
    <artifactId>org.wso2.carbon.apimgt.common.gateway</artifactId>
    <version>9.20.7</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.wso2.carbon</groupId>
    <artifactId>org.wso2.carbon.config</artifactId>
    <version>1.5.5</version>
    <scope>provided</scope>
</dependency>
  1. 配置读取代码实现
    在自定义APIMgtGatewayJWTGeneratorImpl子类中,通过CarbonConfigProvider读取deployment.toml配置:
import org.wso2.carbon.config.ConfigurationException;
import org.wso2.carbon.config.provider.CarbonConfigProvider;
import org.wso2.carbon.config.provider.ConfigProviderFactory;
import org.wso2.carbon.apimgt.common.gateway.jwtgenerator.APIMgtGatewayJWTGeneratorImpl;

public class JwtTokenGenerator extends APIMgtGatewayJWTGeneratorImpl {

    private long jwtExpiryMillis;
    private int tokenCacheTimeout;

    @Override
    public void init() {
        try {
            CarbonConfigProvider configProvider = ConfigProviderFactory.getCarbonConfigProvider();
            
            // 读取自定义JWT过期时间(对应deployment.toml中的apim.gateway.jwt.expiry)
            jwtExpiryMillis = configProvider.getConfiguration(long.class, "apim.gateway.jwt.expiry");
            
            // 读取网关令牌缓存超时(对应默认配置项)
            tokenCacheTimeout = configProvider.getConfiguration(int.class, "apim.gateway.token_cache.timeout");
        } catch (ConfigurationException e) {
            // 配置读取失败时设置默认值
            jwtExpiryMillis = 3600000; // 默认1小时
            tokenCacheTimeout = 900; // 默认15分钟
            log.error("Failed to read configuration values", e);
        }
    }

    // 业务逻辑中直接使用jwtExpiryMillis、tokenCacheTimeout等配置参数
}
  1. 在deployment.toml中添加配置
    在配置文件中补充对应的配置项:
[apim.gateway.jwt]
expiry = 3600000

[apim.gateway.token_cache]
timeout = 900

错误根源说明

网关侧的bundle与后端业务模块的类加载器相互隔离,无法直接访问org.wso2.carbon.apimgt.impl下的类,因此必须使用网关侧专属的CarbonConfigProviderAPI读取配置,同时打包时通过provided scope避免依赖冲突。

内容的提问来源于stack exchange,提问作者Yaroslav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:05:24