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

部署在AWS Lambda的Micronaut应用抛出JWKS Bean注入错误

问题

我有一个Micronaut Kotlin应用,部署在AWS Lambda中作为API Gateway代理。本地运行正常,使用以下配置通过身份提供商(IDP)的JWKS调用API:

---
micronaut:
  application:
    name: video-translation-api
  serde:
    maximum-nesting-depth: 2000
  security:
    enabled: true
    token:
      jwt:
        signatures:
          jwks:
            auth0:
              url: ${JWT_SIGNATURE}


datasources:
  default:
    driverClassName: org.postgresql.Driver
    dialect: POSTGRES
    username: ${DATABASE_USERNAME:""}
    password: ${DATABASE_PASSWORD:""}
    url: ${DATABASE_URL:""}

---
jpa:
  default:
    properties:
      hibernate:
        bytecode:
          provider: none
        hbm2ddl:
          auto: validate
        show_sql: false

部署到Lambda后出现以下错误:

Bean definition [io.micronaut.security.token.jwt.signature.jwks.HttpClientJwksClient] could not be loaded: Failed to inject value for parameter [clientRegistry] of class: io.micronaut.security.token.jwt.signature.jwks.HttpClientJwksClient

Message: No bean of type [io.micronaut.http.client.HttpClientRegistry<io.micronaut.http.client.HttpClient>] exists. 
* [HttpClientRegistry<HttpClient>] is disabled because it is within the package [io.micronaut.http.client] which is disabled due to bean requirements: 
 - No bean of type [io.micronaut.http.client.HttpClientRegistry] present within context
Path Taken: new HttpClientJwksClient(BeanContext beanContext,HttpClientRegistry clientRegistry,HttpClientConfiguration defaultClientConfiguration) --> new HttpClientJwksClient(BeanContext beanContext,[HttpClientRegistry clientRegistry],HttpClientConfiguration defaultClientConfiguration): io.micronaut.context.exceptions.BeanInstantiationException
io.micronaut.context.exceptions.BeanInstantiationException: Bean definition [io.micronaut.security.token.jwt.signature.jwks.HttpClientJwksClient] could not be loaded: Failed to inject value for parameter [clientRegistry] of class: io.micronaut.security.token.jwt.signature.jwks.HttpClientJwksClient

Message: No bean of type [io.micronaut.http.client.HttpClientRegistry<io.micronaut.http.client.HttpClient>] exists. 
* [HttpClientRegistry<HttpClient>] is disabled because it is within the package [io.micronaut.http.client] which is disabled due to bean requirements: 
 - No bean of type [io.micronaut.http.client.HttpClientRegistry] present within context
Path Taken: new HttpClientJwksClient(BeanContext beanContext,HttpClientRegistry clientRegistry,HttpClientConfiguration defaultClientConfiguration) --> new HttpClientJwksClient(BeanContext beanContext,[HttpClientRegistry clientRegistry],HttpClientConfiguration defaultClientConfiguration)
    at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:2003)
    at io.micronaut.context.DefaultApplicationContext.initializeContext(DefaultApplicationContext.java:294)
    at io.micronaut.context.DefaultBeanContext.readAllBeanDefinitionClasses(DefaultBeanContext.java:3384)
    at io.micronaut.context.DefaultBeanContext.finalizeConfiguration(DefaultBeanContext.java:3739)
    at io.micronaut.context.DefaultBeanContext.start(DefaultBeanContext.java:363)
    at io.micronaut.context.DefaultApplicationContext.start(DefaultApplicationContext.java:202)
    at io.micronaut.function.executor.AbstractExecutor.startEnvironment(AbstractExecutor.java:124)
    at io.micronaut.function.executor.FunctionInitializer.startThis(FunctionInitializer.java:124)
    at io.micronaut.function.executor.FunctionInitializer.<init>(FunctionInitializer.java:49)
    at io.micronaut.function.aws.proxy.payload1.ApiGatewayProxyRequestEventFunction.<init>(ApiGatewayProxyRequestEventFunction.java:38)
    at io.micronaut.function.aws.proxy.MicronautLambdaHandler.<init>(MicronautLambdaHandler.java:36)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Unknown Source)
    at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)
Caused by: io.micronaut.context.exceptions.DependencyInjectionException: Failed to inject value for parameter [clientRegistry] of class: io.micronaut.security.token.jwt.signature.jwks.HttpClientJwksClient

Message: No bean of type [io.micronaut.http.client.HttpClientRegistry<io.micronaut.http.client.HttpClient>] exists. 
* [HttpClientRegistry<HttpClient>] is disabled because it is within the package [io.micronaut.http.client] which is disabled due to bean requirements: 
 - No bean of type [io.micronaut.http.client.HttpClientRegistry] present within context
Path Taken: new HttpClientJwksClient(BeanContext beanContext,HttpClientRegistry clientRegistry,HttpClientConfiguration defaultClientConfiguration) --> new HttpClientJwksClient(BeanContext beanContext,[HttpClientRegistry clientRegistry],HttpClientConfiguration defaultClientConfiguration)
    at io.micronaut.context.AbstractInitializableBeanDefinition.resolveBean(AbstractInitializableBeanDefinition.java:2181)
    at io.micronaut.context.AbstractInitializableBeanDefinition.getBeanForConstructorArgument(AbstractInitializableBeanDefinition.java:1328)
    at io.micronaut.security.token.jwt.signature.jwks.$HttpClientJwksClient$Definition.instantiate(Unknown Source)
    at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2332)
    at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2302)
    at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2314)
    at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3116)
    at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80)
    at io.micronaut.context.DefaultBeanContext.findOrCreateSingletonBeanRegistration(DefaultBeanContext.java:3018)
    at io.micronaut.context.DefaultBeanContext.initializeEagerBean(DefaultBeanContext.java:2699)
    at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:1997)
    ... 15 more
Caused by: io.micronaut.context.exceptions.NoSuchBeanException: No bean of type [io.micronaut.http.client.HttpClientRegistry<io.micronaut.http.client.HttpClient>] exists. 
* [HttpClientRegistry<HttpClient>] is disabled because it is within the package [io.micronaut.http.client] which is disabled due to bean requirements: 
 - No bean of type [io.micronaut.http.client.HttpClientRegistry] present within context
    at io.micronaut.context.DefaultBeanContext.newNoSuchBeanException(DefaultBeanContext.java:2789)
    at io.micronaut.context.DefaultApplicationContext.newNoSuchBeanException(DefaultApplicationContext.java:309)
    at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2758)
    at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1752)
    at io.micronaut.context.AbstractBeanResolutionContext.getBean(AbstractBeanResolutionContext.java:89)
    at io.micronaut.context.AbstractInitializableBeanDefinition.resolveBean(AbstractInitializableBeanDefinition.java:2165)
    ... 25 more

禁用security: enabled: true后应用可正常运行,确认问题与Micronaut处理JWKS的逻辑相关。已尝试通过环境变量直接加载JWKS、开放Lambda网络权限,但问题依旧。

解决方案

1. 补充HTTP Client依赖

Lambda环境下Micronaut默认可能不会自动引入HTTP Client依赖,需手动添加:

Gradle Kotlin DSL

implementation("io.micronaut:micronaut-http-client")

Maven

<dependency>
    <groupId>io.micronaut</groupId>
    <artifactId>micronaut-http-client</artifactId>
</dependency>

2. 强制启用HTTP Client

Lambda环境中Micronaut会自动禁用非必要bean优化性能,可通过配置强制启用HTTP Client:

在application.yml中添加:

micronaut:
  http:
    client:
      enabled: true

3. 替换JWKS客户端实现

改用基于UrlConnection的JWKS客户端,避免依赖Micronaut HTTP Client:

  1. 添加依赖:

Gradle Kotlin DSL

implementation("io.micronaut.security:micronaut-security-token-jwt-signature-jwks-urlconnection")

Maven

<dependency>
    <groupId>io.micronaut.security</groupId>
    <artifactId>micronaut-security-token-jwt-signature-jwks-urlconnection</artifactId>
</dependency>
  1. 修改配置指定客户端:
micronaut:
  security:
    token:
      jwt:
        signatures:
          jwks:
            auth0:
              url: ${JWT_SIGNATURE}
              client: urlconnection

4. 预加载静态JWKS密钥(可选)

若Lambda无法访问外部IDP,可直接预加载公钥:

micronaut:
  security:
    token:
      jwt:
        signatures:
          jwks:
            auth0:
              keys:
                - |
                  -----BEGIN PUBLIC KEY-----
                  # 替换为你的IDP公钥内容
                  -----END PUBLIC KEY-----

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:44:54