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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:12:19