Apache Pulsar函数工作器按文档配置OpenID认证失败
问题排查:Pulsar Function Worker OpenID认证启动失败
错误现象
启动时抛出反序列化异常:
[jdk.internal.loader.ClassLoaders$AppClassLoader@659e0bfd] error Uncaught exception in thread main: Cannot construct instance of `java.util.HashSet` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('org.apache.pulsar.broker.authentication.oidc.AuthenticationProviderOpenID')
完整栈跟踪:
Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: 2023-07-06T22:47:15,473Z [jdk.internal.loader.ClassLoaders$AppClassLoader@659e0bfd] error Uncaught exception in thread main: Cannot construct instance of `java.util.HashSet` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('org.apache.pulsar.broker.authentication.oidc.AuthenticationProviderOpenID') Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at [Source: (File); line: 306, column: 26] (through reference chain: org.apache.pulsar.functions.worker.WorkerConfig["authenticationProviders"]) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `java.util.HashSet` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('org.apache.pulsar.broker.authentication.oidc.AuthenticationProviderOpenID') Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at [Source: (File); line: 306, column: 26] (through reference chain: org.apache.pulsar.functions.worker.WorkerConfig["authenticationProviders"]) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1728) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1353) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromString(StdDeserializer.java:311) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.handleNonArray(StringCollectionDeserializer.java:284) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.deserialize(StringCollectionDeserializer.java:192) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.deserialize(StringCollectionDeserializer.java:182) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.deserialize(StringCollectionDeserializer.java:25) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:314) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4674) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3494) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at org.apache.pulsar.functions.worker.WorkerConfig.load(WorkerConfig.java:776) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at org.apache.pulsar.broker.PulsarService.initializeWorkerConfigFromBrokerConfig(PulsarService.java:1840) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at org.apache.pulsar.PulsarBrokerStarter$BrokerStarter.<init>(PulsarBrokerStarter.java:194) Jul 06 22:47:15 lin-0afa7c99.mstarext.com pulsar[6665]: at org.apache.pulsar.PulsarBrokerStarter.main(PulsarBrokerStarter.java:333)
问题根源
配置中的authenticationProviders字段被设置为字符串类型,但WorkerConfig期望的是集合/数组类型(HashSet),Jackson无法将单个字符串直接反序列化为HashSet,导致启动失败。
原错误配置片段:
authenticationProviders: "org.apache.pulsar.broker.authentication.oidc.AuthenticationProviderOpenID"
修正方案
将authenticationProviders改为YAML数组格式:
authenticationEnabled: true authenticationProviders: - "org.apache.pulsar.broker.authentication.oidc.AuthenticationProviderOpenID" properties: openIDAllowedTokenIssuers: "https://stg.some-website.com/" openIDAllowedAudiences: "https://some-website.com/maas, https://some-website.com/userinfo" openIDRoleClaim: "https://some-web.com/role" openIDAcceptedTimeLeewaySeconds: 0 openIDCacheSize: 5 openIDCacheRefreshAfterWriteSeconds: 64800 openIDCacheExpirationSeconds: 86400 openIDHttpConnectionTimeoutMillis: 10000 openIDHttpReadTimeoutMillis: 10000 openIDRequireIssuersUseHttps: true openIDFallbackDiscoveryMode: "DISABLED"
额外注意事项
- 如果需要配置多个认证提供者,直接在数组中追加即可:
authenticationProviders: - "org.apache.pulsar.broker.authentication.oidc.AuthenticationProviderOpenID" - "其他认证提供者类全路径" openIDAllowedAudiences使用逗号分隔多个值是合法格式,无需改为数组。
内容的提问来源于stack exchange,提问作者raah
相关产品推荐
相关产品推荐

