Keycloak 20.0.3报错:未识别字段otpPolicyCodeReusable
问题:Keycloak RealmRepresentation反序列化报错(Unrecognized field "otpPolicyCodeReusable")
使用Keycloak Server和Admin REST Client均为20.0.3版本,执行代码RealmRepresentation realmRepresentation = realmResource.toRepresentation();时,触发如下Jackson反序列化异常:
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "otpPolicyCodeReusable" (class org.keycloak.representations.idm.RealmRepresentation), not marked as ignorable (135 known properties: "userFederationMappers", "rememberMe", "duplicateEmailsAllowed", "adminEventsDetailsEnabled", "users", "clientOfflineSessionMaxLifespan", "webAuthnPolicyRequireResidentKey", "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister", "components", "otpPolicyType", "accessCodeLifespanUserAction", "id", "webAuthnPolicyAttestationConveyancePreference", "enabledEventTypes", "applications", "webAuthnPolicyPasswordlessSignatureAlgorithms", "eventsListeners", "ssoSessionMaxLifespanRememberMe", "defaultDefaultClientScopes", "webAuthnPolicyPasswordlessCreateTimeout", "clientOfflineSessionIdleTimeout", "notBefore", "publicKey", "smtpServer", "clientPolicies", "resetPasswordAllowed", "webAuthnPolicyAvoidSameAuthenticatorRegister", "accessTokenLifespanForImplicitFlow", "webAuthnPolicyPasswordlessUserVerificationRequirement", "clientScopes", "internationalizationEnabled", "defaultRole", "accessTokenLifespan", "passwordCredentialGrantAllowed", "federatedUsers", "applicationScopeMappings" [truncated]]) at [Source: (org.jboss.resteasy.specimpl.AbstractBuiltResponse$InputStreamWrapper); line: 1, column: 1870] (through reference chain: org.keycloak.representations.idm.RealmRepresentation["otpPolicyCodeReusable"]) at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61) at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:1127) at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:2023) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1700) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1678) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:319) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:176) at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323) at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:2025) at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1175) at org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider.readFrom(ResteasyJackson2Provider.java:193) at org.jboss.resteasy.core.interception.jaxrs.AbstractReaderInterceptorContext.readFrom(AbstractReaderInterceptorContext.java:101) at org.jboss.resteasy.core.interception.jaxrs.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:80) at org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readFrom(ClientResponse.java:217) ... 136 more
解决方案
- 严格对齐依赖版本:检查项目中所有Keycloak相关依赖(如
keycloak-admin-client、keycloak-core等)的版本是否完全一致,避免混合版本导致DTO类字段定义不匹配。 - 确认Server实际版本:登录Keycloak控制台的「关于」页面,验证Server的真实版本——即使你认为是20.0.3,也可能存在后台升级或补丁更新,导致返回的响应包含了20.0.3版本Client未定义的字段。
- 临时忽略未知字段:若需快速绕过该问题,可配置Jackson忽略反序列化时的未知字段,通过自定义Resteasy客户端实现:
ResteasyClientBuilder clientBuilder = ResteasyClientBuilder.newBuilder(); ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); clientBuilder.register(new ResteasyJackson2Provider(mapper)); Keycloak keycloak = KeycloakBuilder.builder() // 填入你的Keycloak配置(服务器地址、客户端ID等) .resteasyClient(clientBuilder.build()) .build(); - 升级客户端版本:如果Server确实已包含
otpPolicyCodeReusable字段(该字段是Keycloak 21+版本新增的OTP策略配置项),则需将Admin Client升级到与Server一致的版本,确保DTO类包含对应字段定义。
内容的提问来源于stack exchange,提问作者MMMMMMM
相关产品推荐
相关产品推荐

