LDIF 解析
LDAP 目录交换格式 (LDIF) 文件是用于以平面文件格式描述目录数据的标准介质。这种格式最常见的用途包括信息传输和存档。但是,该标准还定义了一种方法,可以使用平面文件格式来描述对存储数据的修改。后一种类型的 LDIF 通常称为changetype 或modify LDIF。
org.springframework.ldap.ldif
包提供了解析 LDIF 文件并将其反序列化为有形对象所需的类。LdifParser
是 org.springframework.ldap.ldif
包的主要类,能够解析符合 RFC 2849 的文件。此类从资源读取行并将它们组装成 LdapAttributes
对象。
LdifParser 目前忽略changetype LDIF 条目,因为在应用程序上下文中尚未确定其实用性。 |
对象表示
org.springframework.ldap.core
包中的两个类提供了在代码中表示 LDIF 的方法
-
LdapAttribute
:扩展javax.naming.directory.BasicAttribute
,添加对 RFC2849 中定义的 LDIF 选项的支持。 -
LdapAttributes
:扩展javax.naming.directory.BasicAttributes
,添加对 DN 的专门支持。
LdapAttribute
对象将选项表示为 Set<String>
。添加到 LdapAttributes
对象的 DN 支持使用 javax.naming.ldap.LdapName
类。
解析器
Parser
接口为操作提供了基础,并采用了三个支持策略定义
-
SeparatorPolicy
:建立将行组装成属性的机制。 -
AttributeValidationPolicy
:确保在解析之前属性的结构正确。 -
Specification
:提供了一种机制,可以通过该机制在组装后验证对象结构。
这些接口的默认实现如下
-
org.springframework.ldap.ldif.parser.LdifParser
-
org.springframework.ldap.ldif.support.SeparatorPolicy
-
org.springframework.ldap.ldif.support.DefaultAttributeValidationPolicy
-
org.springframework.ldap.schema.DefaultSchemaSpecification
这四个类共同解析逐行资源并将其数据转换为 LdapAttributes
对象。
SeparatorPolicy
确定应如何解释从源文件读取的各个行,因为 LDIF 规范允许属性跨越多行。默认策略在读取行的顺序上下文中评估行,以确定正在考虑的行类型。control 属性和changetype 记录将被忽略。
DefaultAttributeValidationPolicy
使用 REGEX 表达式来确保每个属性在解析后都符合有效的属性格式(根据 RFC 2849)。如果属性验证失败,则会记录 InvalidAttributeFormatException
,并且会跳过该记录(解析器返回 null
)。
模式验证
通过 org.springframework.ldap.schema
包中的 Specification
接口,可以提供一种机制来根据模式验证已解析的对象。DefaultSchemaSpecification
不执行任何验证,可用于已知记录有效且无需检查的实例。此选项可节省验证带来的性能损失。BasicSchemaSpecification
应用基本检查,例如确保已提供 DN 和对象类声明。目前,针对实际模式的验证需要实现 Specification
接口。
Spring Batch 集成
虽然 LdifParser
可以被任何需要解析 LDIF 文件的应用程序使用,但 Spring 提供了一个批处理框架,该框架提供了许多用于解析分隔文件(如 CSV)的文件处理实用程序。org.springframework.ldap.ldif.batch
包提供了在 Spring Batch 框架中将 LdifParser
用作有效配置选项所需的类。此包中有五个类。它们共同提供了三种基本用例
-
从文件读取 LDIF 记录并返回
LdapAttributes
对象。 -
从文件读取 LDIF 记录并将记录映射到 Java 对象 (POJO)。
-
将 LDIF 记录写入文件。
第一个用例是通过 LdifReader
完成的。此类扩展了 Spring Batch 的 AbstractItemCountingItemStreamItemReader
并实现了其 ResourceAwareItemReaderItemStream
。它自然地融入框架,您可以使用它从文件读取 LdapAttributes
对象。
您可以使用 MappingLdifReader
将 LDIF 对象直接映射到任何 POJO。此类要求您提供 RecordMapper
接口的实现。此实现应实现将对象映射到 POJO 的逻辑。
您可以实现 RecordCallbackHandler
并将其提供给任一读取器。您可以使用此处理程序来操作跳过的记录。有关更多信息,请参阅Spring Batch API 文档。
此包的最后一个成员 LdifAggregator
可用于将 LDIF 记录写入文件。此类调用 LdapAttributes
对象的 toString()
方法。