Spring Boot LDAP使用ODM获取memberOf属性报MetaDataException问题咨询
错误根因
你遇到的MetaDataException: Can't determine destination type for field异常,是因为Spring LDAP的ODM组件在解析实体类元数据时,无法识别ArrayList<?>的泛型通配符类型,不知道该把LDAP返回的memberOf属性值转换为什么类型存储,所以抛出异常。
解决方案
按照以下要求修改LdapUser实体类即可:
- 将
memberOf字段的泛型通配符改为明确的String类型,同时优先使用List接口而非ArrayList实现类定义字段:LDAP返回的memberOf属性是多值字符串,每个值为用户所属组的DN,直接映射为List<String>即可。 - 修正
@Attribute注解的属性名,和LDAP服务端的memberOf属性大小写保持一致,避免大小写敏感导致属性读取失败。 - 可选修正:你当前
@Entry注解的objectClasses配置有误,不应该把user和Person写在同一个字符串里,需要拆分为独立的数组元素。
修正后的核心代码示例
@Entry( // 修正objectClasses配置,每个类单独作为数组元素 objectClasses = { "user", "person", "top", "organizationalPerson" }) public class LdapUser { private @Id Name id; private @Attribute(name = "cn") String fullName; private @Attribute(name = "sAMAccountName") String username; // 修正memberOf字段定义,明确泛型类型,匹配属性名大小写 private @Attribute(name ="memberOf", readonly = true) List<String> memberOf; public LdapUser() { } public LdapUser(String fullName, String username, List<String> memberOf) { this.fullName = fullName; this.username = username; this.memberOf = memberOf; } // 同步修改memberOf的get/set方法参数和返回值类型为List<String> public List<String> getMemberOf() { return memberOf; } public void setMemberOf(List<String> memberOf) { this.memberOf = memberOf; } public String getFullName() { return fullName; } public void setFullName(String fullName) { this.fullName = fullName; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
额外注意事项
如果修改后仍然无法获取memberOf属性值,确认你的LDAP服务端(如Active Directory)已配置允许当前绑定账号读取memberOf运算属性,部分LDAP服务默认不会返回该属性,需要额外开启权限配置。
内容的提问来源于stack exchange,提问作者Ivo Huigsloot
相关产品推荐
相关产品推荐

