如何使用Spring LDAP实现含父子类的Java POJO与LDAP映射
Spring LDAP ODM 父子类映射查询子类属性为空问题
问题场景
使用Spring LDAP ODM的@Entry注解实现父类与子类的Java POJO映射LDAP条目时,通过LdapTemplate查询父类类型结果,父类属性能正常填充,但子类属性始终为null。
LDAP条目结构
(注:原LDAP结构包含testObjectClass及对应属性attribute1、attribute2、attribute3等)
代码实现
子类代码
public class ChildClass extends ParentClass{ // 属性名称与LDAP中一致 protected String attribute1; protected String attribute2; }
父类代码
import org.springframework.ldap.odm.annotations.Entry; import org.springframework.ldap.odm.annotations.Id; @Entry(objectClasses = {"testObjectClass"}) public class ParentClass { @Id Name dn; protected String cn; protected List<String> objectClass; // 属性名称与LDAP中一致 protected String attribute3; protected String attribute4; protected String attribute5; }
查询代码
List<ParentClass> results = ldapTemplate.find(dn, filter, searchControls, ParentClass.class);
解决方案
方案1:直接查询子类类型
如果业务场景明确需要获取子类实例,查询时指定子类类型即可,ODM会自动填充父类及子类的所有匹配属性:
List<ChildClass> results = ldapTemplate.find(dn, filter, searchControls, ChildClass.class);
方案2:父类注解中声明子类(Spring LDAP 2.x+支持)
若需要基于父类统一处理多子类场景,可在父类的@Entry注解中通过subclasses属性声明子类,ODM会根据LDAP条目信息自动实例化对应子类:
@Entry(objectClasses = {"testObjectClass"}, subclasses = {ChildClass.class}) public class ParentClass { // 原有属性及代码 }
注意:若存在多个子类,需确保LDAP条目的
objectClass或其他属性能区分不同子类,让ODM可以正确匹配实例化对应的子类类型。
额外注意事项
- 确保子类属性名称与LDAP属性完全一致,若名称不一致需通过
@Attribute注解显式指定映射关系; - 建议为属性添加标准的getter/setter方法,确保ODM可以正常访问并填充属性值。
内容的提问来源于stack exchange,提问作者bpetlur
相关产品推荐
相关产品推荐

